1.如果您使用MVC,您可能有也可能没有服务层。问自己一个以下问题 - 您是否在多个地方使用此功能?如果答案是肯定的 - 请使用 的 应用 强> 服务(不是域名服务)。如果不是,请将其放入MVC控制器本身。
不要在域层中放置任何水合逻辑。 DDD中的域层不应该知道有关持久性的任何信息。控制器/应用程序服务应使用存储库接口获取数据,并使用相同的接口保存数据。在您的情况下,您应该只提取并保存User类,而Job应该低于它作为聚合根子。使用UnitOfWork和Repository非常好。这是一篇很好的文章=>
http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an- ASP净MVC应用程序
2.在某些情况下,使用域对象作为ViewModel类是完全正常的。在其他更复杂的情况下,您必须手动映射属性。映射通常最好作为ViewModel类的扩展方法完成。有些人使用AutoMapper,虽然我在将表示类映射到域时反对使用它。所有这些映射工作都不应该在域层中完成。您可能有很多viewmodel类,它会使表示层逻辑膨胀域层。
希望它有所帮助。
如果您正在使用实体框架,请远离存储库/工作单元模式。 EF本身就是这种模式的一种实现。如果要抽象实体框架,则实现一种服务模式,该模式可以准确地返回完全烘焙的数据。最好用一个例子来说明:
的 使用EF / Repository 强>
IQueryable<Post> posts = db.Posts.Where(m => m.BlogId == blog.Id && m.Status == PostStatuses.Published && m.PublishDate <= DateTime.Now).OrderBy(m => m.PublishDate);
的 随着服务 强>
List<Post> posts = service.GetPublishedPostsForBlog(blog);
这里的两个主要区别是:
你正在返回数据 已经 从服务器中拔出数据库;存储库/ EF将返回可能已经或可能尚未针对数据库执行的可查询。
所有的逻辑都是如此 成 服务的服务方法。然而,使用存储库/ EF可以构建您的查询。
也就是说,不要在应用程序的各个层面上如此挂起。这不是关于你拥有多少层以及你称之为什么层,而是关于从应用程序中抽象逻辑而不需要知道如何构造逻辑。例如,用于返回已发布博客帖子列表的控制器操作不应该知道将帖子限定为“已发布”的内容。这是应该去其他地方的域逻辑(比如返回此数据集的服务方法)。这个想法只是遵循单一责任原则:类/方法/等。应该做 一 事情,并做得很好。您的控制器操作应该只关注返回视图(并且只需要进行少量工作来获取该视图所需的内容)。
就映射而言,该术语完全解释了你的所作所为,所以我不确定这里是否存在混淆。如果你想映射 Post 至 PostViewModel 例如:
Post
PostViewModel
var model = new PostViewModel { Title = post.Title, Content = post.Content, ... }
或者使用对象列表,您可以使用LINQ:
var model = posts.Select(m => new PostViewModel { Title = m.Title, Content = m.Content, ... }
如果你质疑的话就是:我该怎么做 更轻松 ?然后,您可以查看像AutoMapper这样的第三方映射库。
服务层充当应用程序的boundery,它封装了您的域实体,换句话说, 的 它保护您的域名 强> 。与域的所有通信都必须通过服务层。但域模型(最纯粹的形式)不应该对服务层或任何其他基础设施层(DAL / Presentation)有任何引用。
http://martinfowler.com/eaaCatalog/serviceLayer.html
服务是驻留在域层中还是我为应用程序层创建单独的项目?接口是否会进入域层,具体实现是否进入应用层?
如果您已经将图层隔离到自己的项目中,那么服务层应该有自己的项目。
是服务WCF还是我可以创建自己的类?
最简单的服务只是一个类,直接从Microsoft教程中查看服务层的示例: http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs
这是关于如何使用服务层重构MVC的另一个示例 http://www.arrangeactassert.com/asp-net-mvc-controller-best-practices-%E2%80%93-skinny-controllers/
如何在没有表示层泄漏到服务的情况下,使用此服务将我的MVC层中的ViewModel映射回域(如果这是最佳方式)?我已经阅读了DTO,但那么服务层是否有点过分?或者可以将我的域实体公开为ViewModel吗?我一定在想错了。我无法想象这种交互在没有泄漏的情况下如何在控制器中看起来。
这个问题完全是另一个话题。 DTO是服务层与外层通信的好方法。
你的问题非常好,事实上它是最常见的问题。
我在这里回答了同样的问题: https://stackoverflow.com/a/21569720/1027250
这个图片 提供有关服务层如何适合多层体系结构的俯视图。请注意,这对于每个项目都不是绝对的或完美的,您应该根据项目的需要来处理模式。附加层增加了复杂性,这是对拥有大型团队的长期项目的长期投资。