【问题标题】:IRepositories is null in account controller with Unity DI使用 Unity DI 的帐户控制器中的 IRepositories 为空
【发布时间】:2015-08-29 01:38:02
【问题描述】:

我在我的应用程序中使用 Unity DI。我已经在UnityConfig.cs 文件中注册了我的存储库。

 public static void RegisterTypes(IUnityContainer container)
 {
     // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
     // container.LoadConfiguration();

     container.RegisterType<DbContext, RanoChatDbContext>(new HierarchicalLifetimeManager());
     container.RegisterType<UserManager<AppUser>>( new HierarchicalLifetimeManager());
     container.RegisterType<IUserStore<AppUser>, UserStore<AppUser>>(new HierarchicalLifetimeManager());
     container.RegisterType<AccountController>( new InjectionConstructor());
     container.RegisterType<IRepositories, Repositories>();
 }

AccountController

private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
private IRepositories repos;

public AccountController()
{            
}

public AccountController(ApplicationUserManager userManager,
                         ApplicationSignInManager signInManager,
                         IRepositories Repositories)
{
    repos = Repositories;
    UserManager = userManager;
    SignInManager = signInManager;
}

但是repos是null

虽然在我的 HomeController 中正确初始化了相同的存储库。

IRepositories repos;

public HomeController(IRepositories repos)
{
    this.repos = repos;
}

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection unity-container asp.net-identity


    【解决方案1】:

    可能您的 3-arg 构造函数具有 Unity 不知道如何注入的其他类型(ApplicationUserManager、ApplicationSignInManager),因为您没有注册这些类型。

    public AccountController(ApplicationUserManager userManager,
                             ApplicationSignInManager signInManager, 
                             IRepositories Repositories)
    

    此外,它可能只是调用控制器的零参数构造函数。告诉 Unity 你希望它如何实例化控制器,方法是通过以下方式注册它:

    container.RegisterType<AccountController>(new InjectionConstructor(typeof(Repositories)));
    

    参见 MSDN - Registering Injected Parameter and Property Values

    【讨论】:

    • 我用IRepositories .public AccountController(IRepositories repos) { this.repos = repos; } 创建了另一个控制器,但它仍然为空。
    • 那么它将如何被初始化?
    • 我是说你需要确认Unity使用哪个构造函数来实例化AccountController。它可能正在调用默认构造函数。您可以将其配置为其他方式。
    • 谢谢。你最后帮我解决我的问题。 container.RegisterType&lt;AccountController&gt;(new InjectionConstructor(typeof(Repositories)));
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2016-06-07
    • 2016-01-29
    相关资源
    最近更新 更多