我正在通过Unity 2.0来检查它是否在我们的新应用程序中有效使用。我的应用程序是一个Windows窗体应用程序,目前使用传统的栏菜单(在顶部)。
我的UI(Windows窗体)或多或少支持依赖注入模式,因为它们都与通过构造函数提供给它们的类(Presentation Model Class)一起工作。然后,表单绑定到提供的P Model类的属性,并调用P Model类上的方法来执行其职责。非常简单明了。
P模型如何对UI操作作出反应并通过与域类(业务逻辑/模型)协调来响应它们在此处无关紧要,因此未提及。
从菜单中显示一个UI的对象创建序列就是这样 -
我目前的解决方案:
要从我的菜单中显示上述方法中的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程序集),但需要那些引用我的目标的引用 -
动态创建对象链,而不使用Menu程序集中的任何程序集引用。这是为了避免每次发布新模块时菜单源代码都发生变化。我的菜单也是从表格动态构建的。
只需提供新程序集并通过数据库补丁在表中插入新的Dependency行,即可提供新模块。
在这个阶段,我感觉我必须按照我的方式去做,即Activator.CreateInstance()来实现我的所有目标。我需要验证社区是否与我的想法相同,或者有更好的建议来解决问题。
帖子真的很长,如果你到了这一点,我真诚地感谢你。等待你宝贵的建议。
答案 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,因为您必须致电注册(“客户”)。