Rod*_*Rod 0 nhibernate model-view-controller design-patterns repository
我有一个非常通用的存储库,可以为我的许多业务实体执行基本的CRUD.实体enherit形成一个通用对象,它包含我为所有对象维护的几个字段.例如.ModifiedBy,CreatedBy,CreatedDate,ModifiedDate.
在任何更新/保存之前,将始终设置这些字段ModifiedBy和CreatedBy.
我的问题是:有没有办法从我的存储库中的MVC Web应用程序访问Identity对象?我希望将modifiedby设置为身份用户,以便一次性更新?
最好的问候,罗德
好吧,你可以HttpContext.Current.User.Identity直接访问你的存储库,但我不推荐它,因为它会使你的存储库依赖于HttpContext.
备择方案:
IIdentity在Create/Update方法中添加显式参数,例如void Update(T entity, IIdentity user)解耦"获取当前用户"的逻辑,例如:
class GenericRepository<T>: IRepository<T> {
private readonly ICurrentUserFetcher currentUserFetcher;
public GenericRepository<T>(ICurrentUserFetcher currentUserFetcher) {
this.currentUserFetcher = currentUserFetcher;
}
public void Update(T entity) {
var currentUser = currentUserFetcher.Get();
...
}
}
interface ICurrentUserFetcher {
IIdentity Get();
}
class WebCurrentUserFetcher: ICurrentUserFetcher {
public IIdentity Get() {return HttpContext.Current.User.Identity;}
}
Run Code Online (Sandbox Code Playgroud)
甚至更简单:
class GenericRepository<T>: IRepository<T> {
private readonly Func<IIdentity> currentUserFetcher;
public GenericRepository<T>(Func<IIdentity> currentUserFetcher) {
this.currentUserFetcher = currentUserFetcher;
}
public void Update(T entity) {
var currentUser = currentUserFetcher();
...
}
}
var repo = new GenericRepository<Person>(() => HttpContext.Current.User.Identity);
Run Code Online (Sandbox Code Playgroud)
使用IoC容器连接起来.