【问题标题】:Extensible domain model with NHibernate使用 NHibernate 的可扩展域模型
【发布时间】:2010-11-22 03:34:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: nhibernate model dns extensible


    【解决方案1】:

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

    关于插件管理,你可以看看 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 服务的理想场所。

    希望对您有所帮助。

    【讨论】:

    • 非常感谢!我记得简要地阅读过有关子类属性的内容,但我从来没有考虑过。在 NH 做到这一点的能力肯定比我想象的要容易得多。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多