我目前正在设计领域模型和解决方案。存储库可以通过应用程序插件进行扩展。现在,我遇到了一些我在下面列出的问题。
我的第一个问题是使域模型可扩展。我在这里考虑使用继承,但说实话,我不知道如何利用扩展相同域对象的多个插件程序集。我倾向于将每个域对象都局部化,并允许插件以这种方式扩展它。如果我有多个扩展相同域对象的插件,我将不必担心为每个插件加载不同的扩展域程序集。我在运行时仍然只有一个合并的域对象。有什么想法吗?
另一个问题是扩展NHibernate映射文件。我可以让每个程序集嵌入它正在扩展的域对象的映射文件,让我的NHibernate管理器加载它而不是核心域中提供的那个。再一次,问题是如果我有多个插件扩展相同的域对象。我可以有一个插件覆盖另一个的映射文件。 我遇到的最后一个问题的解决方案并不是那么好,但我正在考虑将一个校验和包含在插件程序集中作为它在扩展之前使用的原始映射文件的签名。我可以在加载期间验证此校验和,并仅在校验和匹配时加载插件映射。非常难看,但至少我不会覆盖任何与插件程序集中用于扩展的基本地图不同的地图。
无论如何,我想听听你们对此的看法。谢谢!
答案 0 :(得分: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 Configuration类。例如,在Microsoft Prism中,所有插件都必须实现IModule接口,在加载时调用Initialize()函数。此功能是调用IMappingLoader服务的理想场所。
希望它有所帮助。
答案 1 :(得分:0)
为了获得可扩展的域模型,我将使用大量工厂。工厂可以通过依赖注入进行交换,域对象应该根据接口进行编码。
映射可以通过例如Fluent NHibernate完成,这些可以在那个插件程序集中。
最后,我将向该插件程序集添加可加载配置,该程序集将设置DI容器并加载新映射。对于主要组件,可以使用扫描仪进行插件配置。也许MEF在这里可能会有所帮助,或者你可以制作自己的,这应该不复杂。