Amit Kumar
Amit Kumar

Reputation: 5962

IRepositories is null in account controller with Unity DI

I'm using Unity DI in my application. I have register my Repositories in UnityConfig.cs file.

 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>();
 }

and In 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;
}

But repos is null

while the same repos was intialized correctly in my HomeController.

IRepositories repos;

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

Upvotes: 2

Views: 637

Answers (1)

mrjoltcola
mrjoltcola

Reputation: 20842

Probably your 3-arg constructor has other types that Unity doesn't know how to inject (ApplicationUserManager, ApplicationSignInManager) because you didn't register those types.

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

Also, it may simply be calling the controller's zero-arg constructor. Tell Unity how you want it to instantiate the controller by registering it with something like:

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

See MSDN - Registering Injected Parameter and Property Values

Upvotes: 2

Related Questions