访问 MVC 存储库中的 Identity 对象

发布于 2024-09-04 04:50:42 字数 257 浏览 5 评论 0原文

我有一个非常通用的存储库,可以为我的许多业务实体执行基本的 CRUD。 这些实体继承形成一个通用对象,该对象具有我为所有对象维护的一些字段。 例如。修改者、创建者、创建日期、修改日期。

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

我的问题是: 有什么方法可以从我的存储库中的 MVC Web 应用程序访问 Identity 对象吗? 我希望一次性将修改者设置为身份用户以进行任何更新?

最良好的问候, 杆

I have a pretty generic repository that does basic CRUD for many of my business entities.
The entities enherit form a generic object that has a few fields I maintain for all objects.
eg. ModifiedBy, CreatedBy, CreatedDate, ModifiedDate.

These fields ModifiedBy and CreatedBy will always be set before any update/save.

My questions is:
Is there any way to gain access to the Identity object from my MVC web application in my repositories?
I was hoping to set the modifiedby to the identity user for any update in one shot??

Best Regard,
Rod

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟酒忠诚 2024-09-11 04:50:42

好吧,您可以直接在存储库中访问 HttpContext.Current.User.Identity,但我不推荐它,因为它会使您的存储库依赖于 HttpContext。

替代方案:

  • 在 Create/Update 方法中添加显式 IIdentity 参数,例如 void Update(T实体, IIdentity user)
  • 解耦“获取当前用户”的逻辑“,例如:

    class GenericRepository: IRepository; {
        私有只读 ICurrentUserFetcher currentUserFetcher;
        公共 GenericRepository(ICurrentUserFetcher currentUserFetcher) {
            this.currentUserFetcher = currentUserFetcher;
        }
        公共无效更新(T实体){
            var currentUser = currentUserFetcher.Get();
            ...
        }
    }
    接口 ICurrentUserFetcher {
        IIdentity Get();
    }
    类 WebCurrentUserFetcher: ICurrentUserFetcher {
        公共 IIdentity Get() {return HttpContext.Current.User.Identity;}
    }
    

    或者更简单:

    class GenericRepository: IRepository; {
        私有只读 Func当前用户获取器;
        公共 GenericRepository(Func currentUserFetcher) {
            this.currentUserFetcher = currentUserFetcher;
        }
        公共无效更新(T实体){
            var currentUser = currentUserFetcher();
            ...
        }
    }
    var repo = new GenericRepository(() => HttpContext.Current.User.Identity);
    

    使用 IoC 容器来连接事物。

Well, you could access HttpContext.Current.User.Identity directly in your repositories, but I wouldn't recommend it as it will make your repositories HttpContext-dependent.

Alternatives:

  • Add an explicit IIdentity parameter in your Create/Update methods, e.g. void Update(T entity, IIdentity user)
  • Decouple the logic of "getting the current user", e.g.:

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

    Or even simpler:

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

    Use an IoC container to wire things up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文