使用SimpleInjector为AccountController注册Identity Framework UserStore

Joy*_*Joy 4 asp.net-mvc dependency-injection simple-injector asp.net-mvc-4 asp.net-identity

我有一种情况,我想使用Identity框架中的自定义UserStore.所以我的控制器看起来像这样.

public AccountController()
: this(new UserManager<ApplicationUser>(new MyUserStore()))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
      UserManager = userManager;
}
Run Code Online (Sandbox Code Playgroud)

现在Simpleinjector不允许多个构造函数.它可以允许用一个构造函数注册这些类.当情况与上述情况类似时,我该如何解决这个问题.使用Simpleinjector注册.

Bal*_*ldy 5

Simple Injector需要一个公共构造函数.如果您有多个,则无法确定在运行时使用哪一个.

解决方案是一个设计问题 - 为什么需要多个构造函数?这可以通过问自己来回答......

我是否希望SimpleInjector创建IUserStore的实例,还是应该手动完成?

我认为它是前者,因为如果你不允许注入依赖项,它会使AccountController难以测试.

以下配置(通常存储在App_Start/SimpleInjectorInitializer.cs中)将允许IUserStore实例属于您的自定义类型:MyUserStore,如果构造函数需要这个,它将被注入IUserManager ...

container.Register<IUserStore, MyUserStore>();    
container.Register<IUserManager<ApplicationUser>, UserManager<ApplicationUser>>();
Run Code Online (Sandbox Code Playgroud)

  • +1.很好的答案.请注意,如果需要将许多版本的`IUserManager <T>`映射到`UserManager <T>`,您还可以执行`container.RegisterOpenGeneric(typeof(IUserManager <>),typeof(UserManager <>))`.为此,您需要包含`SimpleInjector.Extensions`命名空间. (2认同)