在动态菜单中应用Unity

时间:2010-04-25 12:04:36

标签: unity-container

我正在通过Unity 2.0来检查它是否在我们的新应用程序中有效使用。我的应用程序是一个Windows窗体应用程序,目前使用传统的栏菜单(在顶部)。

我的UI(Windows窗体)或多或少支持依赖注入模式,因为它们都与通过构造函数提供给它们的类(Presentation Model Class)一起工作。然后,表单绑定到提供的P Model类的属性,并调用P Model类上的方法来执行其职责。非常简单明了。

P模型如何对UI操作作出反应并通过与域类(业务逻辑/模型)协调来响应它们在此处无关紧要,因此未提及。

从菜单中显示一个UI的对象创建序列就是这样 -

  1. 创建业务模型实例
  2. 使用传递给P Model构造函数的Business Model实例创建Presentation Model实例。
  3. 使用传递给UI构造函数的Presentation Model实例创建UI实例。
  4. 我目前的解决方案:

    要从我的菜单中显示上述方法中的UI,我必须从我的Menu类中引用所有程序集(Business,PModel,UI)。考虑到我已将模块拆分为多个物理组件,添加对大约60个不同组件的引用将是一项艰巨的任务。此外,该方法的可扩展性不高,因为我当然需要发布更多模块,而且每次发布新模块时,我都必须更改源代码。

    所以主要是为了避免从我的Menu类(程序集)中引用这么多程序集,我在下面做了 -

    在数据库表(SQL Server)中存储上述所有依赖项,例如:

    ModuleShortCode | BModelAssembly | BModelFullTypeName | PModelAssembly | PModelFullTypeName | UIAssembly | UIFullTypeName

    现在使用一个名为“Launcher”的静态类,其方法为“Launch”,如下所示 -

    Launcher.Launch("Discount");
    Launcher.Launch("Customers");
    

    Launcher在内部使用依赖表中的数据,并使用Activator.CreateInstance()创建每个对象,并将该实例用作下一个正在创建的对象的构造函数参数,直到构建UI。然后,UI显示为模式对话框。 Launcher中的代码有点像 -

    Form frm = ResolveForm("Discount");
    frm.ShowDialog();`
    

    ResolveForm可以解决构建对象链的问题。

    Unity可以帮助我吗?

    现在,当我这样做时,我没有足够的关于Unity的信息,现在我已经研究过Unity,我认为我已经或多或少地做了同样的事情。所以我尝试用Unity替换我的代码。

    然而,一旦我开始,我就碰到了一个街区。如果我尝试在我的菜单中解析UI表单

    Form customers = myUnityContainer.Resolve<Customers>();
    

    Form customers = myUnityContainer.Resolve(typeof(Customers));
    

    然后,无论哪种方式,我都需要从我的菜单程序集中引用我的UI程序集,因为Unity需要知道目标类型“Customers”才能解决它。所以我回到了同一个地方,因为我必须从菜单程序集中引用所有UI程序集。我理解,使用Unity,我将不得不引用更少的程序集(只有UI程序集),但需要那些引用我的目标的引用 -

    1. 动态创建对象链,而不使用Menu程序集中的任何程序集引用。这是为了避免每次发布新模块时菜单源代码都发生变化。我的菜单也是从表格动态构建的。

    2. 只需提供新程序集并通过数据库补丁在表中插入新的Dependency行,即可提供新模块。

    3. 在这个阶段,我感觉我必须按照我的方式去做,即Activator.CreateInstance()来实现我的所有目标。我需要验证社区是否与我的想法相同,或者有更好的建议来解决问题。

      帖子真的很长,如果你到了这一点,我真诚地感谢你。等待你宝贵的建议。

      • Rajarshi

1 个答案:

答案 0 :(得分:0)

正如我从这段代码中看到的那样

Form customers = myUnityContainer.Resolve<Customers>();

您的所有代码都需要了解客户 - 这是一个Form类。因此,如果您使用xml配置进行统一,则可以执行以下操作:

 <type type="Form" mapTo="Customer"  name="Customer">
 </type>

然后你就可以像这样解决它:

Form customers = myUnityContainer.Resolve<Form>("Customer");

并且无需重新引用UI程序集。它应该在bin目录或GAC中显示。在这种情况下,如果您要开发新的程序集 - 您只需要更改配置并放入bin或gac。

如果您想从db进行统一配置,那么您必须将参考添加到您的ui,因为您必须致电注册(“客户”)。