我们目前有一个项目使用寿命很长,其中数据层实体被用作域模型实体,这显然在经过多年的扩展后让我们感到悲痛。我们中的一小部分人的任务是基本上重新编写应用程序的框架,然后我们将逐个过渡。
我们的第一个决定是确保我们的域实体不是基于数据库。相反,我们与企业主沟通,并建立了坚持普适语言原则的对象。域模型代码现在全部完成,我们对此非常满意。
现在问题的关键在于此。我们正在使用Microsoft Entity Framework 6使用数据库优先生成我们的数据层,因为在将所有内容迁移到新架构之前我们无法开始将数据库更改为代码优先,并且我们需要数据库中的数据。所以我们计划做的是将我们的Domain实体映射到EF6实体(反之亦然)。
我的第一个想法是使用AutoMapper在存储库实现中来回映射,但我觉得我缺少一些简单的东西,或者实体框架6中的某些功能,我没有使用或滥用这将解决这个问题。我觉得我们不能成为那种遭受这种情况的唯一一群人。
任何人都可以向我们提供一些有关如何解决此问题的见解吗?作为一个说明,我们坚持不包括上下文或我们的域模型中包含的任何数据层,包括工作单元。我们使用Autofac作为DI容器,多个应用程序使用我们的域模型。
答案 0 :(得分:1)
正确封装的域对象不起作用(既没有ORM也没有doc db),没有可能长期困扰你的变通方法。最干净,但很无聊的解决方案是使用纪念品来实现持久性。
域对象将提供纪念品,并将使用纪念品来恢复自身。持久性只适用于那个纪念品,你可以用它做你想做的一切,因为它是一个DTO。
同时,如果你还没有这样做,我建议你去CQRS(也许是事件采购)。在这两种情况下你都会有一个写模型供域使用,至少有一个读其他人使用的模型。它确实需要更多的代码,但从长远来看它简化了事情,因为你总是会使用专用于单一用途的模型而不是一个模型用于所有事情。
关于工作单元,通过域事件和传奇来模拟流程。你必须处理最终的一致性(心理问题)和幂等性(技术问题),但你的应用程序将非常灵活和可维护。