如何动态加载模块棱镜/组合应用的图书馆?
-
07-07-2019 - |
题
我有一个 类 在我的棱镜/CAL的应用程序 产生的一种形式 供用户填写的数据。
该形式是由一个定义 XML 文件这样的:
<area idCode="general" title="General">
<column>
<group title="Customer Data">
<field idCode="title" requiredStatus="true">
<label>title</label>
<fieldType>Title</fieldType>
</field>
<field idCode="firstName" requiredStatus="true">
<label>First Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="lastName" requiredStatus="true">
<label>Last Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="email" requiredStatus="true">
<label>E-Mail</label>
<fieldType>Email</fieldType>
</field>
...
</group>
</column>
</area>
形式需要加载 具体 控制这相当于每 领域的类型 在XML,例如
- 标题 (显示了拉:先生,女士,博士,等等。)
- 文本 (简单文本)
- 电子邮件 (框电子邮件的验证)
- 邮政编码 (文本用邮政编码验证)
我想要控制每个单独模块被装载这样,例如的 邮政编码 模块将存在一个模块的目录作为文件:
ZipCode.dll
这只是一个 简单文本 控制验证的基础上邮政编码,但是开发人员可以使另一个控制称为:
ZipCodePlus.dll
它继承了 相同的接口 但提供了一个弹的地理地选择邮编.只要一个客户替换 ZipCode.dll 与 ZipCodePlus.dll, 所有的他形式会有这个 新的 功能 为寻找邮政编码。
然而,我有麻烦显示如何将从技术上实现,因为作为我的形式类分析XML,例化的课程,它提供的功能控制,但是为了 实例 类,我们有一个 参考 它:
SmartFormFieldZipCodePresenter smartFormFieldEmailPresenter
= container.Resolve<SmartFormFieldEmailPresenter>();
但我怎么可以创建实例 动态, 即与类的名称为 字符串, 如果这类不存在,那么它将引发一个合适的 异常, 如事情是这样的:
伪码:
try {
var smartFormFieldZipCodePresenter
= container.Resolve("smartFormFieldZipCodePresenter");
}
catch (ModuleDoesNotExistException) {
...
}
解决方案
看来你是非常接近一个技术解决您的问题。我只想创建一个接口 IZipCodePresenter
-和我ZipCode.dll 或ZipCodePlus.dll 模块的启动、登记的实施。
Container.RegisterType<IZipCodePresenter, StandardZipCodePresenter>();
然后在你的分析器,解决实例,如:
var zipCodePresenter = container.Resolve<IZipCodePresenter>();
假设没有实例注册的接口,一个例外将会被抛出。否则,你将获得最后登记的具体执行IZipCodePresenter.注意,例外只会被扔如果你尝试和登记册的一个接口。如果你尝试注册种类与团结,它将创建一个实例基础上的终生管理政策。
如果你想更进一步,与此,您可以创建一个接口...像IDynamicPresenter.然后您可以登记根据已知的string(定义在你的基础设施项目)。
Container.RegisterType<IDynamicPresenter, StandardZipCodePresenter>(PresenterName.ZipCodeControl);
Container.RegisterType<IDynamicPresenter, StandardEmailPresenter>(PresenterName.EmailControl);
然后解决如下:
var zipCodeControl = Container.Resolve<IDynamicPresenter>(PresenterName.ZipCodeControl);
var emailControl = Container.Resolve<IDynamicPresenter>(PresenterName.EmailControl);
我更喜欢以前的解决方案,但这当然是一个有效的选择。
希望这可以帮助!
P.s.这听起来像是一个有趣的想法...我有兴趣听听你是怎么得到执行。你甚至可以移动一步,并创建一个整体XAML生成器框架的基础的某些概念在ASP.NET 视.它可有助于缓解在测试,而有的力量WPF.祝你好运!