访问MVC存储库中的Identity对象

Rod*_*Rod 0 nhibernate model-view-controller design-patterns repository

我有一个非常通用的存储库,可以为我的许多业务实体执行基本的CRUD.实体enherit形成一个通用对象,它包含我为所有对象维护的几个字段.例如.ModifiedBy,CreatedBy,CreatedDate,ModifiedDate.

在任何更新/保存之前,将始终设置这些字段ModifiedBy和CreatedBy.

我的问题是:有没有办法从我的存储库中的MVC Web应用程序访问Identity对象?我希望将modifiedby设置为身份用户,以便一次性更新?

最好的问候,罗德

Mau*_*fer 5

好吧,你可以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容器连接起来.