团结新手问题

时间:2009-06-24 21:39:32

标签: .net architecture dependency-injection unity-container

我第一次尝试使用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实例执行一组通用逻辑,即使生成的实例和映射的属性对它也不熟悉。

谢谢!

2 个答案:

答案 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实例,则实例将被注入该构造函数参数。