我有 MVC5 应用程序,并且使用 Unity 作为 IOC 容器。我正在注册所有组件,如下所示。一切都工作正常,直到我在
MyAccount
中引入了一个新类 MyDomainService
。
现在,当 Unity 尝试解析
HomeController -> MyDomainService -> MyAccount
时,我收到错误:
值不能为空。参数名称:字符串
嗯,
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;
}
}
这不是 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) { .. }