问题
I am using ASP.NET MVC 5 with Unity 3 and Unity bootstrapper for ASP.NET MVC.
In the UnityConfig.cs file, I registered the following type in the RegisterTypes method:
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IProjectRepository, ProjectRepository>();
}
In an MVC controller, I am resolving like this:
UnityContainer container = new UnityContainer();
public ActionResult List()
{
var projectRepository = container.Resolve<IProjectRepository>();
return View(projectRepository.GetAll());
}
But I am getting the following exception:
System.InvalidOperationException: The type IProjectRepository does not have an accessible constructor.
When I register the type inside the controller, then it works perfectly, so somehow unity is forgetting about what was defined in UnityConfig.RegisterTypes()
.
I put a break point in UnityConfig.RegisterTypes()
and the method is being called.
回答1:
You are not getting registered dependency because you are actually creating new container which does not have any information about registered types in UnityConfig.RegisterTypes().
You can get current unity container for example using constructor injection
IUnityContainer container;
public MyController(IUnityContainer _container)
{
container = _container;
}
EDIT: Also in my opinion for better decoupling it is better not to use container directly. You can easily initialize you repository object using the same constructor injection.
IProjectRepository projectRepository;
public MyController(IProjectRepository _projectRepository)
{
projectRepository = _projectRepository;
}
Second approach is much better because you are not coupled to any particular dependency injector. In future if you need to change dependency injector you won't need to change controller code.
来源:https://stackoverflow.com/questions/20489460/types-not-resolving-with-unity-mvc-5