Unity v4.0似乎解决了所有依赖关系而无需显式注册

时间:2016-12-12 15:46:57

标签: c# dependency-injection unity-container

虽然我之前在上一个雇主的应用程序中看到了Unity DI,但我是第一次将它添加到一个,并且实际上是Unity新手。因此,当我使用Unity v4.0.1时,我会慢慢地进行测试。

我有一个带有简单依赖关系图的控制台应用程序:LoadPayees,它依赖于PayeeLogic,它依赖于CommissionsRepository。

我用一种方法创建了一个非常简单的Unity注册类:

public class UnityRegistration
{
    public static void RegisterCommissionsTypes(IUnityContainer container)
    {
        container.RegisterType<ILoadPayees, LoadPayees>();
    }
}

一份决议声明:

var processorInstance = (BaseTaskProcessor) container.Resolve(Type.GetType(classWithAssembly));

其中带有程序集的类解析为LoadPayees。

我已在loadPayees for PayeeLogic中创建了一个方法注入器:

   [InjectionMethod]
    public void Initialize(PayeeLogic payeeLogic)
    {
        this._payeeLogic = payeeLogic;
    }  

和PayeeLogic for CommissionsRepository中的构造函数注入器:

    private CommissionsRepository _commissionsDal;

    public PayeeLogic(CommissionsRepository commissionsDal)
    {
        this._commissionsDal = commissionsDal;
    } 

创建了这个,然后我在VS中进行了调试,期望它用空引用异常爆炸,因为我没有用Unity明确注册PayeeLogic或CommissionsDAL,但事实并非如此。整个过程成功进行,就像我修改它以使用Unity之前一样。

所以要么我错过了一些愚蠢的事情(很可能),或者Unity能够自动找出所有LoadPayees的依赖关系,这不是我的预期。

所以我向Unity专家提出的问题是,哪一个更有可能?

1 个答案:

答案 0 :(得分:0)

答案是肯定的,一旦使用Unity注册并解析顶级对象,它就可以找出对象依赖性,因此对象注入将起作用。然而,那是什么。 DI的主要目的是能够为实现相同接口的对象交换具体对象实例化,因此如果要这样做,则需要注册并解析整个对象图。

我对代码进行了如下更改:

public static void RegisterCommissionsTypes(IUnityContainer container)
{
    container.RegisterType<ILoadPayees, LoadPayees>();
    container.RegisterType<IPayeeLogic, PayeeLogic>();
    container.RegisterType<IPayeeDataAccess, CommissionsRepository>();
    var payeeLogic = container.Resolve<PayeeLogic>();
    var payeeDal = container.Resolve<CommissionsRepository>();
}

(LoadPayee分辨率不变)

private IPayeeLogic _payeeLogic;

方法注入:

[InjectionMethod]
public void Initialize(IPayeeLogic payeeLogic)
{
    this._payeeLogic = payeeLogic;
}

构造函数注入:

private IPayeeDataAccess _commissionsDal;

public PayeeLogic(IPayeeDataAccess commissionsDal)
{
    this._commissionsDal = commissionsDal;
}

这是一个非常新手的问题,甚至可能是一个愚蠢的问题?希望它可以帮助另一个Unity新手了解这个产品。