3

我目前正在设计可以通过应用程序插件扩展域模型和存储库的解决方案。现在,我遇到了一些我在下面列出的问题。

  1. 我的第一个问题是使域模型可扩展。我正在考虑在这里使用继承,但老实说,我不知道如何利用多个插件程序集扩展同一个域对象。我有点倾向于使每个域对象都是局部的,并允许插件以这种方式扩展它。如果我有多个插件扩展同一个域对象,我不必担心为每个插件加载不同的扩展域程序集。在运行时我仍然只有一个合并的域对象。对此有什么想法吗?

  2. 另一个问题是扩展 NHibernate 映射文件。我可以让每个程序集为其扩展的域对象嵌入映射文件,并让我的 NHibernate 管理器加载它,而不是核心域中提供的那个。再一次,问题是如果我有多个插件扩展同一个域对象。我可以让一个插件覆盖另一个插件的映射文件。我对最后一个问题的解决方案不是很好,但我正在考虑在插件程序集中包含一个校验和,作为它在扩展它之前使用的原始映射文件的签名。我可以在加载期间验证此校验和,并且仅在校验和匹配时才加载插件映射。非常难看,但至少我不会覆盖与插件程序集中用于扩展的基本地图不同的任何地图。

无论如何,我想听听你们对此的看法。谢谢!

4

2 回答 2

0

好消息是,您所要求的都是可能的,而且管理起来并不难。

关于插件管理,您可以查看 Microsoft Prism ( http://msdn.microsoft.com/fr-fr/magazine/cc785479.aspx ),它是关于模块化应用程序开发的几个不错的功能。

关于 1. 你可以在单独的映射中映射子类,在单独的程序集中,查找 NH 文档。子类的单独映射文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="YourClassFullName, YourPluginAssemblyName"
            extends="YourParentClassFullName, TheAssemblyWhereYourBaseClassIsDefined"
            discriminator-value="whateveryouwant">
    ... add your subclass mapping here ...
  </subclass>
</hibernate-mapping>

关于 2. 您可以保留您的核心域映射。一种更简单的方法是创建一个服务(比如说 IMappingLoader),您的插件可以使用它来注册您的额外映射(而不覆盖基类映射)。您对该服务的实现会将您的映射添加到 NH 配置类。例如,在 Microsoft Prism 中,您所有的插件都必须实现 IModule 接口,该接口在加载时会调用 Initialize() 函数。此函数是调用 IMappingLoader 服务的理想场所。

希望它有所帮助。

于 2009-08-24T12:02:51.760 回答
0

为了使域模型可扩展,我将使用很多工厂。工厂可以通过依赖注入来换入/换出,并且域对象应该针对接口进行编码。

例如,映射可以通过 Fluent NHibernate 完成,这些可以在该插件程序集中。

最后,我将向该插件程序集添加可加载配置,该程序集设置 DI 容器并加载新映射。对于主程序集,可能有插件配置的扫描仪。也许MEF在这里可能会有所帮助,或者您可以自己制作,这不应该很复杂。

于 2009-08-24T13:20:34.043 回答