【发布时间】:2014-02-17 14:05:58
【问题描述】:
我无法将我读过的许多帖子中的点联系起来(并且意识到我可能需要购买 Eric Evans 的书,而不是依赖大量的互联网资料)我正在努力坚持领域驱动设计,但我在将我的数据保存回数据库之前,我在从表示层到我的域的最佳通信方法上遇到了麻烦。为了简单起见,现在我有一个用户类,它可以有一个工作列表。当用户打开应用程序时,他们的活动目录信息被查询,并且只要他们打开应用程序,这个类就会填充他们的数据。然后,用户可以编辑现有工作(如果他们拥有该工作)或创建新工作。我开始创建一个使用我的 UnitOfWork 类的服务类,认为这可以作为我的通信,但这就是我被困的地方。
当前设置:
DAL - EF 6 生成的 POCO 和 DbContext、存储库、工作单元
域 - 我在这篇文章中提到的实体、存储库和工作单元接口、域接口服务?
Presentation - MVC(Intranet),具体服务?
问题:
对于这种类型的通信(以及创建域类的新实例(例如创建新作业的方法)),服务类是实现的最佳类吗?我意识到我可以使用工厂模式,但我还不想变得太复杂)?服务会驻留在域层还是我为应用层创建一个单独的项目?那么接口会进入领域层,具体实现会进入应用层吗?我觉得这可能会使应用程序过于复杂。另外,服务是 WCF 还是我可以创建自己的类?
-
如何使用此服务(如果这是最好的方法)将 MVC 层中的 ViewModel 映射回域,而不会使表示层泄漏到服务中?我已经阅读了有关 DTO 的内容,但是在服务层中这是否有点过头了?还是可以将我的域实体公开为 ViewModel?我一定是在错误地思考这个问题。我无法想象这种交互在没有泄漏的情况下在控制器中的外观。抱歉所有问题,谢谢。
public class User { public int Id{ get; set; } public string WindowsId{ get; private set; } public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return FirstName + " " + LastName; } } public string Email { get; set; } public string WorkPhone { get; set; } public List<Job> Jobs { get; private set; } public void AddJob(Job job) { if(job == null) throw new Exception("Job is null"); var newJob = new Job(this) //tell the job that this user is creating the job { Description = job.Description, DueDate = job.DueDate, Name = job.Name, Reason = job.Reason }; Jobs.Add(newJob); } }
更新:我的解决方案
我最终从每个人的答案中提取了一点。
@granadaCoder - 我使用我的 EF POCO 作为类作为 DTO 传递,因为大多数时候这是我在 ViewModel 中向用户显示的数据。所以它允许我使用 DTO 作为 ViewModel
@ChrisPratt - 你是对的。这样做可以避免很多额外的工作。我所做的只是创建一个包含我需要的所有查询的服务。如果我不得不更改 EF,它仍然不会打扰我的其他层。我所要做的就是创建存储库和 UOW
@MilivojMilani - 我确实在控制器中有重复逻辑,因此服务层让我与 DRY 主体保持一致
@Yorro - 我使用你的观点和参考来加强设计,因为我仍然不确定服务层设置。由于这是一个较小的项目,我用我创建的服务和界面设置了另一个文件夹,没有 WCF
【问题讨论】:
-
我认为这是与架构相关的问题,而不是与 DDD 相关的问题。您看过“端口和适配器”架构吗?它可能会给你一些方向和答案。 alistair.cockburn.us/Hexagonal+architecture
-
我喜欢本教程的地方在于作者对“已连接”与“未连接”的关系非常明确......也许它会有所帮助。 entityframeworktutorial.net/…
-
我认为您的重大决定是您是否通过网络传递 EF-POCO 或您自己的 POCO。我已经尝试让 EF 填充 EF-POCO,然后将它们转换为 My-POCO。并通过网络发送那些。变得困难的是,当您将它们传回时,必须重新连接对象模型的层次结构(MyPoco 到 EF-Poco)并让 EF 正确更新所有内容。这是一个 NHibernate 参数...有点映射到 EF:thatextramile.be/blog/2010/05/…
-
@granadaCoder,这样的图表是否可以工作:存储库 -> 实体
-
我不知道我们是否说同一种语言,但我有:Repository(Pattern) --> MyPocoDAL --> EFPocoTranslater --> EF --> EFPoco's -- > MyPoco 的
标签: c# asp.net-mvc entity-framework domain-driven-design