asp.net-mvc – 提供DDD,但需要一些其优点

我放弃传统的DDD,这往往是一个巨大的时间,并强迫我做无尽的映射:数据层<域层<表示层。 即使是一个小的变化,我必须改变数据模型,域模型,演示模型/视图模型,然后存储库,管理器/服务类,当然还有AutoMapper映射,然后测试整个事情!每个呼叫都需要调用一个调用一个调用底层代码的层的层。除了“你以后可能需要”之外,我没有得到任何回报。咩。 我目前的做法更务实:
>我不用担心“数据层”和“域层”之间的差异,因为没有意义 – 这些术语是可以互换的。我让EF做它的事情,并在需要的时候添加界面和存储库。
>我已将我的“数据”和“域”项目合并(“核心”,无聊的名称,我知道),我几乎可以发誓Visual Studio实际运行更快。
>我允许EF实体上下栈,但是我仍然像往常一样将它们映射到演示模型/视图模型。
>对于简单的操作,我直接从控制器调用存储库,对于复杂的操作,我照常使用域管理器/服务;存储库从不暴露IQueryable。
>我将实体/ POCO定义为部分类,因此我可以在相应的部分类中单独添加域行为。

问题:我现在使用这些实体,所以客户端代码可以看到他们的导航属性。模型在他们离开存储库后总是实现的,所以这些导航属性通常是空的。

可能的解决方案:
与它一起生活这是丑的,但比上述问题更好。
2.对于每个实体,定义隐藏导航属性的接口;并使客户端代码使用接口。但讽刺的是,这意味着另一层(虽然薄而易于管理)。
还有什么?

我不习惯这种快速和松散的编程风格,所以也许我缺少一些明显的技巧。还有什么我应该考虑的吗?我确定还有其他问题我很快会遇到。

编辑:
这个问题不是DDD。并注意到许多与传统DDD方法的斗争 – Seemann appears tothe same conclusionRahien speaks about the “Useless Abstraction For The Sake Of Abstraction Anti Pattern”,Evans自己说DDD在5%的情况下才是真正有用的。还有see this thread.有些评论/答案是可以预测的,我如何做DDD错误,或者我如何调整我的系统做正确的。但是,我不是要求DDD或者是适合的情况,而是想知道其他人正在做的是如上所述的思考。这不像DDD是所有设计弊病的灵丹妙药,每十年一个新的过程都会出现(RUP任何人?XP,敏捷,Booch,blah …)。 DDD只是最新的,最知名和最常用的。但是,实用主义应该是第一次,因为我正在努力建立按时运送并易于维护的可销售产品。迄今为止,我学到的最有用的编程公理是YAGNI。我想要的是将我的系统改成一种“DDD-lite”,在那里我得到它的强大的设计/ OOP /模式哲学,但没有胖。

解决方法

使用DDD的典型持久化方法是将域模型直接映射到相应的表。在技​​术上,映射仍然存在(通常在代码中声明),但是没有明确的数据模型,如lazyberezovsky所指出的。

导航属性的问题可以通过几种不同的方式解决,无论您是否使用DDD。我不喜欢方法1,因为它使得更难理解你的代码 – 你永远不知道哪些属性将被设置,哪些不会。方法2在理论上要好得多,因为它使得它非常明确地表明给定的查询需要什么,使事情明确是一个很好的做法。类似但是更简单和不那么脆弱的方法是使用read-models,它只是被设计为满足给定查询集的要求的对象。在DDD的背景下,它们允许您将行为丰富的实体与查询分离,这些查询通常是不对的。现在DRY支持者可能会尖叫异端,用火把和干草叉给你,但在实践中,维护一个阅读模型和一个实体往往要容易得多,以便通过接口或复杂的映射来强制实体来满足查询要求策略。另外,读取模型和行为模型的职责也是完全不同的,因此,DRY不适用。

这并不是说DDD适用于您的场景。避免完全成熟的DDD通常是一个明智的决定,特别是在大多数情况下为CRUD.您是正确的,谨慎,KISS and YAGNI一个很好的例子。当您的域由复杂行为组成,而不仅仅是数据时,DDD会收获好处。无论如何,read-model模式都适用。

UPDATE

对于不使用读取模型的实现,请查看Fetching Strategy Design,其中提取策略的概念允许从数据库中精确地规定需要的内容,从而缓解导航属性的问题。在链接的帖子中引用的材料也是感兴趣的。总而言之,这试图避免其他方法中存在的一层间接问题。然而,在我看来,使用提出的提取策略比使用阅读模型更复杂,而净结果是相同的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: &#39; Style=&quot;position: relative&quot; AppendDataBoundItems=&quot;True&quot;&gt; (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke &#39;*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the &quot;Report Items&quot; section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating