在OOP设计模式中,存储库模式和服务层之间有什么区别?
我正在开发一个ASP.NET MVC 3应用程序,我正在尝试理解这些设计模式,但我的大脑却没有得到它......
我使用.Net开发了多年的企业应用程序我的应用程序通常有一个包含映射到SQL DB表的实体的域模型.我使用Repository模式,依赖注入和服务层.
最近我们开始研究MVC 3项目,我们讨论了在哪里放置哪些逻辑.我来自瘦控制器/ FAT模型架构,并想知道服务层如何适应
控制器很薄,调用模型上的方法.模型"知道"如何从数据库加载自己并与存储库或服务进行通信.例如,customerModel有一个Load(id)方法,并加载客户和一些子对象,如GetContracts().
Controller要求服务检索模型对象.加载/存储等逻辑在服务层中.该模型是仅具有数据的纯实体模型.
为什么选项1会成为更好的选择,特别是当我们谈论企业应用时,我的经验告诉我要分离问题,让模型和控制器尽可能地薄,并且有专门的服务来做业务逻辑(imcl.数据库交互)
感谢所有建议和对优质资源的参考.
architecture model-view-controller asp.net-mvc service-layer asp.net-mvc-3
假设您有一个ASP.NET MVC项目并且正在使用服务层,例如在asp.net站点上的这个联系管理器教程中:http: //www.asp.net/mvc/tutorials/iteration-4-make-的应用程序,松散耦合-CS
如果您有视图的视图模型,那么服务层是否适合提供每个视图模型?例如,在服务层代码示例中有一种方法
public IEnumerable<Contact> ListContacts()
{
return _repository.ListContacts();
}
Run Code Online (Sandbox Code Playgroud)
如果你想要一个IEnumerable,它应该进入服务层,还是在其他地方是"正确"的地方?
也许更合适的是,如果您为与ContactController关联的每个视图都有一个单独的视图模型,那么ContactManagerService是否应该有一个单独的方法来返回每个视图模型?如果服务层不是正确的位置,那么viewmodel对象应该在哪里被初始化以供控制器使用?
当我阅读有关存储库的文档时,通常使用实体和集合,但是以"只读"的方式.
从来没有存储库具有类似insertUser(User $user)
或的方法的示例updateUser(User $user)
.
但是,在使用SOA时,Service不应该使用Entity Manager(这是对的,不是吗?)所以:
从这两个问题,另一个问题,我的服务应该明确persist()
和flush()
我的实体吗?
我知道这可能听起来很愚蠢,但我发现很难理解服务层的需求及其与业务层的差异.
因此,我们使用asp.net mvc 2并拥有数据访问层,它对数据库进行所有查询,然后我们拥有业务层,其中包含需要完成的业务逻辑和验证.最后我们有Presentation Layer,基本上有所有的视图.此外,我们还在不同的文件夹中有一些帮助程序,DTO和viewmodel类作为我们库的一部分.但我试图阅读有关架构的内容,似乎服务层是架构的重要组成部分.
我所理解的是服务层是调用所有功能的东西.但我真的不能在我们的应用程序中看到Service层的需要吗?或者它可能已经存在并且我看不到它......任何人都可以用一个例子解释一个服务层是如何重要的?它与业务层有什么不同,因为从我读过的内容看起来非常相似?如果它在第一个需要的话?我们所要做的就是以最佳方式构建我们的应用程序您对它的想法和经验是什么?
architecture business-logic-layer service-layer asp.net-mvc-2
混淆使用JSF2 + Spring + EJB3或它们的任意组合让我感到有些困惑.我知道Spring的一个主要特性是依赖注入,但是我可以使用JSF托管bean @ManagedBean
和@ManagedProperty
anotations,并获得依赖注入功能.使用EJB3,我更加困惑何时将其与JSF一起使用,或者甚至有理由使用它.
那么,在什么样的情况下使用Spring + JSF2或EJB3 + JSF2是个好主意?
到目前为止,我只使用JSF2创建了一些小型Web应用程序,从不需要使用Spring或EJB3.但是,我在许多地方看到人们正在将所有这些东西放在一起.
我一直在阅读有关将业务逻辑放在ASP.NET MVC项目中的位置,我仍然无法弄清楚某些事情.
1 - 领域模型.这些真的是什么?在我的Model文件夹中,我只有一堆与我的数据库对应的类.我先使用EF代码.我认为这些是我的域模型.
2 - 服务层.这个答案暗示了一个服务层,我觉得这很有道理.我决定和这个一起去.然而,Martin Fowler的"贫血领域模型"文章搞砸了我的想法.
我不确定如何为我的域模型添加逻辑.
我经历了许多与业务逻辑相关的问题,每个问题都提出了1或2.我不明白的是我如何实现第一个问题.向实体类添加方法(对我来说是域模型)根本没有意义.为什么第二种方法被认为是坏的?
asp.net-mvc business-logic domain-model service-layer anemic-domain-model
我目前有一个服务层,它基于ASP.NET站点中的服务层验证一文.
根据这个答案,这是一个糟糕的方法,因为服务逻辑与违反单一责任原则的验证逻辑混合在一起.
我真的很喜欢提供的替代方案,但在重新分解我的代码时,我遇到了一个我无法解决的问题.
请考虑以下服务接口:
interface IPurchaseOrderService
{
void CreatePurchaseOrder(string partNumber, string supplierName);
}
Run Code Online (Sandbox Code Playgroud)
基于链接答案的以下具体实现:
public class PurchaseOrderService : IPurchaseOrderService
{
public void CreatePurchaseOrder(string partNumber, string supplierName)
{
var po = new PurchaseOrder
{
Part = PartsRepository.FirstOrDefault(p => p.Number == partNumber),
Supplier = SupplierRepository.FirstOrDefault(p => p.Name == supplierName),
// Other properties omitted for brevity...
};
validationProvider.Validate(po);
purchaseOrderRepository.Add(po);
unitOfWork.Savechanges();
}
}
Run Code Online (Sandbox Code Playgroud)
PurchaseOrder
传递给验证器的对象还需要两个其他实体,Part
并且Supplier
(假设此示例中PO只有一个部分).
如果用户提供的详细信息与数据库中需要验证程序抛出异常的实体不对应,则Part
和Supplier
对象都可以为null.
我遇到的问题是,在此阶段验证器丢失了上下文信息(部件号和供应商名称),因此无法向用户报告准确的错误.我可以提供的最佳错误是"采购订单必须具有关联部件",这对用户没有意义,因为他们确实提供了部件号(它在数据库中不存在).
使用ASP.NET文章中的服务类,我正在做这样的事情:
public void …
Run Code Online (Sandbox Code Playgroud) 我查看了http://solitarygeek.com/java/developing-a-simple-java-application-with-spring/comment-page-1#comment-1639上的示例
我试图找出他提供的示例中首先需要服务层的原因.如果你把它拿出来,那么在你的客户端,你可以这样做:
UserDao userDao = new UserDaoImpl();
Iterator users = userDao.getUsers();
while (…) {
…
}
Run Code Online (Sandbox Code Playgroud)
看起来服务层只是DAO的包装器.有人可以给我一个案例,如果服务层被删除,事情会变得混乱吗?我只是没有看到开始使用服务层的重点.
我怎么可以注入的依赖一样@EJB
,@PersistenceContext
,@Inject
,@AutoWired
,等的@FacesValidator
?在我的具体情况下,我需要通过以下方式注入Spring托管bean @AutoWired
:
@FacesValidator("emailExistValidator")
public class EmailExistValidator implements Validator {
@Autowired
private UserDao userDao;
// ...
}
Run Code Online (Sandbox Code Playgroud)
然而,它没有被注射,它仍然存在null
,导致java.lang.NullPointerException
.看来@EJB
,@PersistenceContext
并且@Inject
也不起作用.
如何在验证器中注入服务依赖项以便我可以访问数据库?
service-layer ×10
asp.net-mvc ×4
spring ×3
architecture ×2
c# ×1
doctrine-orm ×1
domain-model ×1
ejb ×1
java-ee ×1
jsf ×1
jsf-2 ×1
oop ×1
soa ×1
symfony ×1
validation ×1