我有MVC5应用程序,我使用Unity作为IOC容器。我正在注册所有组件,如下所示。一切都很好,直到我介绍
新课程MyAccount
加入MyDomainService
。
现在,当团结尝试解决HomeController -> MyDomainService -> MyAccount
我得到错误
值不能为空。参数名称:String
好MyAccount
构造函数没有任何参数
public class MyAccount
{
public MyAccount()
{
}
}
public class MyDomainService:IDisposable
{
private IGenericRepository _repository;
private MyAccount _myAccount;
// it works if i remove MyAccount from the constructor
public MyDomainService(IGenericRepository repository, MyAccount MyAccount)
{
_repository = repository;
_myAccount = MyAccount;
}
}
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<MyDomainService, MyDomainService>(new HierarchicalLifetimeManager());
container.RegisterType<IGenericRepository, GenericRepository>(new HierarchicalLifetimeManager());
container.RegisterType<DbContext, MYDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<MyAccount, MyAccount>();
// MVC5
DependencyResolver.SetResolver(new Unity.Mvc5.UnityDependencyResolver(container));
UnityServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);
}
}
public class HomeController:Controller
{
MyDomainService _service;
public HomeController(MyDomainService service)
{
_service = service;
}
}
答案 0 :(得分:0)
这不是 Unity DependencyInjection 开箱即用的方式。
您应该始终只接受构造函数中的DependencyInjection实体,并且只有在整个类(例如MyDomainService)不能没有任何传递依赖项的情况下才能生存。
如果DomainService
是:
强烈依赖于IGenericRepository
和MyAccount
,那么您应该考虑让MyAccount
也在IOC容器中注册(并相应地重新设计该类)。
仅在IGenericRepository
或 MyAccount
中强烈依赖(重新设计后),那么您应该只将构造函数传递给依赖的构造函数并传递使用的方法依赖实体。
例如
public DomainService(IGenericRepository genericRepository) { ... }
public void Method1(MyAccount account) { .. }
public void AnotherExampleMethod2(AnotherDependedClass anotherClass, int justANumber) { .. }