Domain driven design asp.net核心标识simpleinjector注册应用程序服务器管理器

Domain driven design asp.net核心标识simpleinjector注册应用程序服务器管理器,domain-driven-design,asp.net-core-identity,Domain Driven Design,Asp.net Core Identity,我正在尝试隔离ASP.NET Core Identity version 1.1.2,architecture DDD,并创建一个横切层来为aspnet Core Identity创建一个类库,我使用SimpleInjector 4.0.8作为我的IoC,因此我创建了一个类ApplicationUserManager和ApplicationSignInManager,但我无法在simlpleinjector容器中注册这个类 ApplicationUserManager public class

我正在尝试隔离ASP.NET Core Identity version 1.1.2,architecture DDD,并创建一个横切层来为aspnet Core Identity创建一个类库,我使用SimpleInjector 4.0.8作为我的IoC,因此我创建了一个类ApplicationUserManager和ApplicationSignInManager,但我无法在simlpleinjector容器中注册这个类

ApplicationUserManager

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store,
        IOptions<IdentityOptions> optionsAccessor,
        IPasswordHasher<ApplicationUser> passwordHasher,
        IEnumerable<IUserValidator<ApplicationUser>> userValidators,
        IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators,
        ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors,
        IServiceProvider services,
        ILogger<UserManager<ApplicationUser>> logger)
            : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {
        // My configurations stuffs were...
    }
}
public class ApplicationSignInManager : SignInManager<ApplicationUser>
{
    public ApplicationSignInManager(UserManager<ApplicationUser> userManager,
        IHttpContextAccessor contextAccessor,
        IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,
        IOptions<IdentityOptions> optionsAccessor,
        ILogger<SignInManager<ApplicationUser>> logger)
            : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger)
    { }

    // TODO: bug com tipo de retorno IdentityResult para ClaimsPrincipal
    //public override Task<ClaimsPrincipal> CreateUserPrincipalAsync(ApplicationUser user)
    //{
    //    return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
    //}
}
公共类应用程序管理员:用户管理员
{
公共应用程序服务器管理器(IUserStore存储,
IOPS选项访问器,
IPasswordHasher密码hasher,
IEnumerable用户验证程序,
IEnumerable密码验证器,
ILookupNormalizer键规范化器,IdentityErrorDescriptiber错误,
IServiceProvider服务,
ILogger(记录器)
:base(存储、选项访问器、密码哈希器、用户验证器、密码验证器、密钥规范化器、错误、服务、记录器)
{
//我的东西是。。。
}
}
应用程序SigningManager

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store,
        IOptions<IdentityOptions> optionsAccessor,
        IPasswordHasher<ApplicationUser> passwordHasher,
        IEnumerable<IUserValidator<ApplicationUser>> userValidators,
        IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators,
        ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors,
        IServiceProvider services,
        ILogger<UserManager<ApplicationUser>> logger)
            : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {
        // My configurations stuffs were...
    }
}
public class ApplicationSignInManager : SignInManager<ApplicationUser>
{
    public ApplicationSignInManager(UserManager<ApplicationUser> userManager,
        IHttpContextAccessor contextAccessor,
        IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,
        IOptions<IdentityOptions> optionsAccessor,
        ILogger<SignInManager<ApplicationUser>> logger)
            : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger)
    { }

    // TODO: bug com tipo de retorno IdentityResult para ClaimsPrincipal
    //public override Task<ClaimsPrincipal> CreateUserPrincipalAsync(ApplicationUser user)
    //{
    //    return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
    //}
}
公共类应用程序SignInManager:SignInManager
{
公共应用程序SigninManager(用户管理器用户管理器,
IHttpContextAccessor上下文访问器,
IUSERclaimsprincipal工厂索赔工厂,
IOPS选项访问器,
ILogger(记录器)
:base(userManager、contextAccessor、claimsFactory、OptionAccessor、logger)
{ }
//TODO:bug com tipo de Returno IdentityResult para ClaimsPrincipal
//公共覆盖任务CreateUserPrincipalAsync(ApplicationUser用户)
//{
//返回user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
//}
}
我试着像这样在BootStrapper.cs中注册这个类

public static void RegisterServices(Container container)
    {
        // Infra.Data App Context
        // IdentityAppDbContext
        container.RegisterSingleton(() => 
        {
            var options = new DbContextOptions<IdentityAppDbContext>();
            return new IdentityAppDbContext(options);
        });

        // NetCore Identity
        container.RegisterSingleton<ApplicationUserManager>();
        container.RegisterSingleton<ApplicationSignInManager>();
        container.RegisterSingleton<IUserStore<ApplicationUser>>(() =>
        {
            var options = new DbContextOptions<IdentityAppDbContext>();
            return new UserStore<ApplicationUser>(new IdentityAppDbContext(options));
        });
        container.Register(() => (IOptions<IdentityOptions>)new IdentityOptions());
        container.RegisterSingleton<IPasswordHasher<ApplicationUser>>(() => new PasswordHasher<ApplicationUser>());

    }
publicstaticvoidregisterservices(容器)
{
//基础数据应用程序上下文
//IdentityAppDbContext
container.RegisterSingleton(()=>
{
var options=new DbContextOptions();
返回新标识yappdbcontext(选项);
});
//网络核心身份
container.RegisterSingleton();
container.RegisterSingleton();
container.RegisterSingleton(()=>
{
var options=new DbContextOptions();
返回新的UserStore(新的IdentityAppDbContext(options));
});
container.Register(()=>(IOptions)newidentityoptions());
RegisterSingleton(()=>newpasswordhasher());
}

但是当我运行应用程序返回时,erros说我需要在constructors类中注册IOptions、IPasswordHasher和其他参数,问题是,如何注册这个类?

我有一个类似的要求:我的应用程序需要与identity交互(这基本上是关于人力资源的,他们可能有自己的用户帐户,也可能没有),在与框架容器中的身份问题斗争了很长一段时间后,我试图配置simple injector来提供所有身份服务。称之为疯狂,但它就是这样工作的(SimpleInjector 4.0和ASP.Net Identity Core 2.0.1):

这是“配置服务”部分:

//从外部提供标识选项,允许配置框架
container.RegisterSingleton(新选项包装器(identityOptions));
//我们依赖于BCrypt而不是默认的PBKDF2散列算法
Register(()=>newbcryptpasswordhasher(bcryptOptions));
//将框架记录器转发到我们自己的日志框架
container.Register();
Register(typeof(Microsoft.Extensions.Logging.ILogger),typeof(Microsoft.Extensions.Logging.Logger));
//identity store=特定实体框架核心DbContext,映射到特定db方案
容器。注册表单(identitydbcontextions);
container.Register();
//UserStore和RoleStore都需要一个DbContext(没有IdentityDbContext,也没有通用TDBCContext)
//通过构造函数,但是容器只知道MepIdentityDbContext,所以我们必须手动连接它
container.Register(()=>newuserstore(
container.GetInstance(),
container.GetInstance());
容器.寄存器(()=>新角色存储(
container.GetInstance(),
container.GetInstance());
//框架内部服务
container.Register();
container.Register();
container.Register();
container.Register();
container.Register();
container.Register();
//Net核心标识违反了SimpleInjector的设计决策:API明确区分了集合的注册
// https://simpleinjector.readthedocs.io/en/latest/decisions.html#the-api明确区分了集合的注册
//通过使用简单的包装单项数组注册违反服务的IEnumerables,Identity很高兴
Register(()=>new[]{container.GetInstance()});
Register(()=>new[]{container.GetInstance()});
Register(()=>new[]{container.GetInstance()});
//角色和用户管理器反映了整个ASP.Net核心标识框架的API表面
container.Register();
//UserManagerShim正在忽略UserManager的IServiceProvider参数(=为空)
container.Register();
这需要在“配置”期间完成,否则密码重置和其他双因素令牌内容将无法工作(运行时错误,尽管容器已验证)

//如果您急切地实例化一个被认为是单例的提供者实例
//将其放入TokenProviderDescriptor的相应字段中,并在选项的
//提供程序映射,ASP.Net核心标识将使用此标识,而不是询问IServiceProvider
//实例注入UserManager(我们不这样做,因为