简单的注入器获取UserStore的实例

时间:2015-04-01 12:14:43

标签: dependency-injection inversion-of-control ioc-container simple-injector

这就是我注册我的身份类的方式:

     container.RegisterPerWebRequest<AppDbContext>();

        container.RegisterPerWebRequest<IAppUserStore>(() =>
            new AppUserStore(container.GetInstance<AppDbContext>()));

        container.RegisterPerWebRequest<AppUserManager>();


        container.RegisterPerWebRequest<AppSignInManager>();

        container.RegisterInitializer<AppUserManager>(
            manager => InitializeUserManager(manager, app));

帐户管理员:

 private readonly AppSignInManager _signInManager;
    private readonly AppUserManager _userManager;

    public AccountController(AppUserManager userManager, AppSignInManager signInManager )
    {
        _signInManager = signInManager;
        _userManager = userManager;
    }

一切都很好,但是当我尝试输入类似

的东西时
 var test = new Container().GetInstance<IAppUserStore>();

我收到下一个错误:找不到类型IAppUserStore的注册

GetInstance<AppDbContext>没问题

为什么我不能获得这些实例? Container.Verify()编译没有错误。

1 个答案:

答案 0 :(得分:3)

var test = new Container().GetInstance<IAppUserStore>();

将失败,因为您正在创建一个没有注册的Container的新实例,因此当您说IAppUserStore(接口)时,不知道您要求的实现(即类)。

Container().GetInstance<AppDbContext>()

可以工作,因为你要求一个类,即使Container尚未注册,Container也会创建一个类的实例,只要Container可以解析该类型的所有构造函数参数

尽量避免在Composition Root之外引用Container。如果AccountController需要IAppUserStore,那么您应该考虑将其添加到AccountController的构造函数中。