asp.net-mvc – 洋葱建筑 – 存储库与服务?
我正在从杰弗里·巴勒莫学习着名的洋葱建筑。
不是特定于这种模式,但是我看不清楚存储库和域服务之间的分隔。 我(误)了解存储库涉及数据访问和服务更多关于业务层(参考一个或多个存储库)。 在许多例子中,存储库似乎具有像GetAllProductsByCategoryId或GetAllXXXBySomeCriteriaYYY这样的业务逻辑。 对于列表,似乎服务只是存储库中的包装器,没有任何逻辑。 解决方法
存储库不是访问数据库的网关。这是一种抽象,允许您从某种形式的持久性存储中存储和加载域对象。 (数据库,缓存或甚至纯粹的集合)。它采取或返回域对象而不是其内部字段,因此它是面向对象的接口。
不建议将诸如GetAllProductsByCategoryId或GetProductByName之类的方法添加到存储库中,因为随着用例/对象字段计数的增加,您将添加越来越多的存储库方法。相反,最好在存储库中具有一个“规范”的查询方法。您可以通过规范的不同实现来检索产品。 总的来说,存储库模式的目标是创建一个存储抽象,当用例更改时不需要更改。 This article详细介绍了域建模中的Repository模式。你可能有兴趣 对于第二个问题:如果我在代码中看到一个ProductRepository,我希望它返回一个Product列表。我也期望每个Product实例都是完整的。例如,如果Product有对ProductDetail对象的引用,那么我希望Product.getDetail()返回一个ProductDetail实例而不是null。可能实施的库将ProductDetail与Product一起加载,也许getDetail()方法即时调用ProductDetailRepository。我并不关心作为存储库的用户。当我调用getDetail()时,产品也可能只返回ProductDetail id。从仓库合同的角度来看,这是完美的。然而,我的客户端代码复杂化,迫使我自己调用ProductDetailRepository。 顺便说一句,我看到过许多服务类,只包含过去的存储库类。我认为这是一种反模式。最好让服务的呼叫者直接使用存储库。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 使用Web Deploy发布ASP.NET MVC2站点
- 使用ASP.NET Identity实现基于声明的授权,高级篇
- asp.net-mvc – ASP.NET MVC切换语言,如何实现?
- 哪些ASP.NET生命周期事件在HttpApplication.Error之后发生?
- asp.net – 从EF自动迁移切换到代码优先迁移
- asp.net – MVC [HandleError] HandleErrorAttribute在使用
- asp.net-mvc – ASP.NET MVC:三态复选框
- asp.net – “读取XML数据时已超出”最大字符串内容长度配额
- asp.net – 哪个最快?数据检索
- asp.net-mvc – 共享WCF服务和身份验证的MVC2应用程序(和其
- asp.net – 如何在aspx.cs页面中访问对象标签?
- asp.net-mvc – 在IE中清除cookie后,保持用户登录
- asp.net-mvc – MVC中Ninject的适当存储库LifeCy
- ASP.NET MVC 4将模型从视图传递给html帮助器
- asp.net-mvc – ViewModel中的最佳实践
- asp.net-mvc – 为什么HttpPostedFile不像广告和
- asp.net-mvc – Asp mvc 3 noobie:为什么代码优
- asp.net-mvc-3 – Razor Func与MvcHtmlString混合
- Asp.net SignalR 让实时通讯变得如此简单
- Asp.Net Web Api – 发布英国日期格式