我有一个 在我的棱镜/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.dllZipCodePlus.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.祝你好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top