代码之家  ›  专栏  ›  技术社区  ›  Serge

含NHibernate的可扩展域模型

  •  3
  • Serge  · 技术社区  · 15 年前

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

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

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

    不管怎样,我想听听你们怎么想。谢谢!

    2 回复  |  直到 15 年前
        1
  •  0
  •   Nelson    15 年前

    好消息是,你所要求的是可能的,并不难管理。

    关于插件管理,您可以看一下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服务的理想位置。

    希望它有帮助。

        2
  •  0
  •   Marek Tihkan    15 年前

    为了获得可扩展的域模型,我将使用许多工厂。工厂可以通过依赖注入进行交换,域对象应该根据接口进行编码。

    例如,可以通过fluent nhibernate进行映射,这些映射可以在插件程序集中进行。

    最后,我将向插件程序集添加可加载配置,该程序集设置DI容器并加载新映射。对于主程序集,可能有用于插件配置的扫描仪。也许吧 MEF 你可以在这里帮忙,也可以自己做,这不应该很复杂。

    推荐文章