Unity 抛出错误“值不能为空”。参数名称:字符串'

问题描述 投票:0回答:1

我有 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;
    }
}
asp.net-mvc inversion-of-control unity-container
1个回答
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) { .. }
© www.soinside.com 2019 - 2024. All rights reserved.