【问题标题】:Repository pattern on ASP.NET Core with Identity带有标识的 ASP.NET Core 上的存储库模式
【发布时间】:2018-09-03 14:47:26
【问题描述】:

如何使用 ASP.NET Core Identity 实现存储库模式?

我找到了一个 solution 来使用 ASP.NET Core 实现存储库模式,但如果您还使用身份框架,则不会。

我读到的唯一内容是关于使用两个独立的数据库:一个用于身份表,另一个用于业务数据,但我想知道是否可以在 ASP 上为单个数据库实现存储库模式。 NET Core 项目与 Identity。

【问题讨论】:

  • 这不是关于两个独立的数据库,而是关于两个独立的上下文。这些表可能在一个数据库中,但您不应该混合上下文。这完全是关于分离关注点。您可以编写自己的存储库,只是不要包含身份表(因为它们不应该是其他上下文的一部分)。
  • 谢谢。有关如何使用 EF Core 在同一个数据库上使用两个上下文的任何示例?还有一个问题:如果我应该使用单独的上下文(一个用于身份,另一个用于业务数据),将业务上下文中的表与身份的用户表相关联的正确方法是什么?
  • @RuardvanElburg 我不同意。有时您的用户是业务模型的一部分,让身份模型和其他模型属于同一数据库上下文是有意义的。特别是如果您需要与用户对象之间的外键。我还尝试了单独的上下文并最终将它们合并,因为维护开销高于分离的任何其他好处。
  • @trailmax 我不能说我有同样的经历。混合上下文比保持上下文分离给我带来的麻烦和工作要多得多。并且使用 IdentityServer 我不能混合上下文,因为两者都在不同的机器和数据库上。但这不仅仅是分隔表格,还在于将信息放在正确的上下文中。
  • 感谢两位。我找到了这个链接:aarcoraci.wordpress.com/2017/03/07/…,它似乎遵循了 Ruard van Elburg 的建议(我还没有完全阅读它),但我找不到任何关于如何使用一个数据库和一个上下文的信息,正如@trailmax 所说,并且这是我个人更喜欢的方式,因为我认为这更适合我的应用程序(用户与业务表有关系)。因此,请提供更多关于您的方法的信息/示例,我真的很想学习这两种方法。

标签: asp.net-core asp.net-identity


【解决方案1】:

你可以在 asp.net core 中使用 Autofac 作为你的依赖注入。这是有关如何在 Asp.net 身份项目中使用 Autofac 的文档:Doc

首先在 Startup.cs 中的服务中添加身份

services.AddIdentity<User,IdentityRole>().AddDefaultTokenProviders();

等等,你可以在你的服务层中注册一个模块(或者你在存储库模式中命名的任何东西)并在你注册 DbContext 和你的服务之后配置它们:

var dbContextParameter = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(IdentityDbContext),
                                                        (pi, ctx) => ctx.Resolve<DatabaseContext>());

            builder.RegisterType<UserStore<User, IdentityRole<Guid>, DatabaseContext, Guid>>()
                .As<IUserStore<User>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();

            builder.RegisterType<UserManager<User>>()
                .As<UserManager<User>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();

            builder.RegisterType<SignInManager<User>>()
                .As<SignInManager<User>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();

            builder.RegisterType<RoleStore<IdentityRole>>()
                .As<IRoleStore<IdentityRole>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();

上面的代码是注册UserStore的方式,可以像这样制作UserManager、SignInManager等类

请注意,您可以像这样将您的服务注册为其实现的接口:

var Service = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(Service)
                   .AsImplementedInterfaces();

然后您可以像这样将身份服务注入您的服务构造函数:

 public UserService(Data.IRepositoryX<User> repository, IUnitOfWorkDatabaseContext unit, SignInManager<User> signInManager) : base(repository)
    {

    }

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2016-11-26
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多