虽然我之前在上一个雇主的应用程序中看到了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专家提出的问题是,哪一个更有可能?
答案 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新手了解这个产品。