Unity抛出错误'值不能为空。参数名称:String'

时间:2016-06-02 17:39:47

标签: asp.net-mvc inversion-of-control unity-container unity5

我有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;
        }
    }

1 个答案:

答案 0 :(得分:0)

这不是 Unity DependencyInjection 开箱即用的方式。

您应该始终只接受构造函数中的DependencyInjection实体,并且只有在整个类(例如MyDomainService)不能没有任何传递依赖项的情况下才能生存。

如果DomainService是:

  • 强烈依赖于IGenericRepositoryMyAccount,那么您应该考虑让MyAccount也在IOC容器中注册(并相应地重新设计该类)。

    < / LI>
  • 仅在IGenericRepository MyAccount中强烈依赖(重新设计后),那么您应该只将构造函数传递给依赖的构造函数并传递使用的方法依赖实体。

例如

public DomainService(IGenericRepository genericRepository) { ... }

public void Method1(MyAccount account) { .. }
public void AnotherExampleMethod2(AnotherDependedClass anotherClass, int justANumber) { .. }