Unity выдает ошибку 'Значение не может быть нулевым. Имя параметра: строка
У меня есть приложение MVC5, и я использую Unity в качестве контейнера IOC. Я регистрирую все компоненты, как показано ниже. Все работало нормально, пока я не представил новый класс MyAccount
в MyDomainService
,
Теперь, когда единство пытаются решить 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;
}
}
1 ответ
Это не то, как 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) { .. }