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) { .. }
Другие вопросы по тегам