【问题标题】:Accessing the Identity object in a MVC repository访问 MVC 存储库中的 Identity 对象
【发布时间】:2010-05-31 21:31:20
【问题描述】:

我有一个非常通用的存储库,它为我的许多业务实体执行基本的 CRUD。 实体继承形成一个通用对象,该对象具有我为所有对象维护的一些字段。 例如。 ModifiedBy、CreatedBy、CreatedDate、ModifiedDate。

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

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

最好的问候, 棒

【问题讨论】:

    标签: nhibernate model-view-controller repository design-patterns


    【解决方案1】:

    好吧,您可以直接在您的存储库中访问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 容器进行连接。

    【讨论】:

    • 感谢 Mauricio,您给了我一些不错的选择。我试图避免与 http 上下文耦合,所以我想我会尝试第二个选项。
    • 我对文章中的人似乎如何为第二个示例实现 ICurrentUserFetcher 感到有些困惑。我假设它将提供 IIdentity 不提供的额外属性。有人可以澄清一下这段代码,因为它会在我必须做的事情上派上用场吗?
    • 老实说,我是 Unity 容器或任何 IoC 容器的新手。如何将 IIdentity 注入存储库?
    • @user1790300 这是Func&lt;IIdentity&gt;,而不是IIdentity。不了解 Unity,请尝试文档或创建一个新的、更具体的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多