我第一次尝试使用Unity,我想我可能已经咬过的东西比我可以咀嚼的多。我们有一个n层应用程序,它有一个带有几种抽象类型的基础库,然后是几个基于业务场景的库,具有混凝土类型。例如:抽象类型引导有两个实现,一个在名为NewAutomotiveLead的NewAutomotiveLibrary中,另一个在名为AutomotiveFinanceLead的AutomotiveFinanceLibrary中。在基础库中,我们有一组适配器,可以对像Lead这样的基本类型执行逻辑。
我第一次尝试使用Unity返回一个接口ILeadDuplication,当解析后,当我在ILeadDuplication上调用resolve并传递字符串值“NewAutomotive”或“”时,返回NewAutomotiveLeadDuplication或AutomotiveFinanceLeadDuplication的实例。 AutomotiveFinance“(在容器上调用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实例执行一组通用逻辑,即使生成的实例和映射的属性对它也不熟悉。
谢谢!
答案 0 :(得分:0)
不太确定你在追求什么,但我的猜测是你想在施工时传递一个依赖。这可以通过多种方式完成,但这是一个例子。
[InjectionConstructor]
public class MyClass([Dependency("Named")] MyOtherClass other)
{
}
为了使其工作,名为“Named”的MyOtherClass依赖项必须通过配置或通过RegisterType方法添加到容器中。
让我知道,如果我不在基地,也许我可以帮助你...我在不同的情况下与Unity工作了很多,所以只要我知道你想要完成什么我就可以帮助你出去了。
答案 1 :(得分:0)
我不明白你为什么要让容器承担这个责任。但我认为你可以这样做:
在您调用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实例,则实例将被注入该构造函数参数。