我是第一次尝试使用 Unity,我想我可能已经贪多嚼不烂了。我们有一个 n 层应用程序,它有一个具有多个抽象类型的基础库,然后在其之上有几个具有具体类型的业务场景特定库。例如:抽象类型 Lead 有两种实现,一种在名为 NewAutomotiveLead 的 NewAutomotiveLibrary 中,一种在名为 AutomotiveFinanceLead 的 AutomotiveFinanceLibrary 中。在基础库中,我们有一组适配器,可以对 Lead 等基本类型执行逻辑。
我第一次尝试使用Unity返回一个接口ILeadDuplication,当我在ILeadDuplication上调用resolve并传递“NewAutomotive”或“AutomotiveFinance”的字符串值时,该接口解析时返回NewAutomotiveLeadDuplication或AutomotiveFinanceLeadDuplication的实例(在容器上调用 RegisterType 时映射的名称)。像这样:
using (IUnityContainer container = new UnityContainer())
{
container
.RegisterType<ILeadDuplication, AutomotiveFinanceLeadDuplication>("AutomotiveFinance")
.RegisterType<ILeadDuplication, NewAutomotiveLeadDuplication>("NewAutomotive");
ILeadDuplication dupe = container.Resolve<ILeadDuplication>("AutomotiveFinance");
Console.WriteLine(dupe.Created);
}
注意:这只是为了说明,因为库不知道有关 ILeadDuplication 的 concreate 类的任何信息,实际注册需要在配置文件中完成。
虽然这一切都很有效,但我需要更进一步。调用resolve时,我需要能够传入Lead类型的参数,它是NewAutomotiveLead或AutomotiveFinanceLead的基本类型。
我需要知道 Unity 是否有可能以某种方式神奇地查找特定于具体实例 AutomotiveFinanceLead 的属性,例如 Lead 上不存在的“GrossMonthlyIncome”,并将其分配给新创建的 AutomotiveFinanceLeadDuplication 实例属性 GrossMonthlyIncome。
我实际上希望能够对基础库中的 ILeadDuplication 实例执行一组通用逻辑,即使生成的实例和映射的属性对其不熟悉。
不太确定你想要什么,但我的猜测是你想在构建时传递依赖项。这可以通过多种方式完成,但这里有一个例子。
[InjectionConstructor]
public class MyClass([Dependency("Named")] MyOtherClass other)
{
}
为了使其正常工作,名为“Named”的 MyOtherClass 依赖项必须位于容器中,或者通过配置或通过 RegisterType 方法添加它。
如果我偏离了基地,请告诉我,也许我可以进一步帮助您...我在不同情况下使用 Unity 进行了很多工作,因此只要我知道您想要完成什么,我也许可以帮助您.
我不明白为什么你希望容器承担这个责任。但我认为你可以这样做:
在调用 Resolve() 获取 ILeadDuplication 的新实例之前,您可以注册要使用的 Lead 实例以及要使用的 GrossMonthlyIncome 值:
Lead lead = new NewAutomotiveLead()
container.RegisterInstance<Lead>(lead);
container.RegisterInstance<int>("GrossMonthlyIncome", lead.GrossMonthlyIncome);
ILeadDuplication dupe = container.Resolve<ILeadDuplication>("AutomotiveFinance");
如果具体类型具有名为“GrossMonthlyIncome”的依赖项,则该值将被注入其中。如果具体类型的构造函数采用 Lead 实例,则该实例将被注入到该构造函数参数中。