0

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

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

我的问题是: 有没有什么办法从我的仓库中的MVC Web应用程序获得对Identity对象的访问权? 我曾希望将修改后的设置更改为身份用户的一次性更新?

最佳方面, 杆

回答

5

嗯,你可以直接访问HttpContext.Current.User.Identity在你的仓库,但我不会推荐它,因为它会让你的仓库HttpContext的依赖。

替代方案:

  • 添加一个明确的IIdentity参数在创建/更新的方法,例如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;} 
    } 
    

    或者更简单的逻辑:

    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); 
    

    使用IoC容器进行接线的事情了。

+0

谢谢Mauricio,你给我一些很好的选择。我试图避免与http上下文耦合,所以我想我会尝试第二种选择。 – Rod 2010-06-01 18:01:58

+0

对于第二个例子中文章中的人员如何实现ICurrentUserFetcher,我有点困惑。我认为它会提供Identity无法提供的额外属性。有人可以提供清晰的代码,因为它可以派上用场,我必须做的事情? – user1790300 2013-05-26 23:27:28

+0

@ user1790300固定,谢谢 – 2013-05-27 00:22:09

相关问题