我正在开发一个分层的ASP.Net MVC 3 Web应用程序(EF 4.1):模型,存储库,服务,控制器,某些情况下的ViewModel和视图。
现在我的问题是最好的做法之一。需要访问另一个实体的实体服务类是否应使用其服务或其存储库。例如,假设实体A的服务方法需要在创建A时更新实体B. A的服务类应该使用B的存储库还是服务层?两者都有可能,但最佳做法是什么?就个人而言,我更喜欢一项服务来访问另一项服务。这样,它可以作为访问更多进化方法的说法。
答案 0 :(得分:2)
我更喜欢在服务类之间调用,因为您可能还需要来自其他服务的一些业务逻辑。但要小心避免循环依赖。我建议你使用依赖注入,这将帮助你避免可能的循环依赖。还要考虑为服务类创建接口,并从客户端类中使用此接口(将具体实现传递给构造函数)。
然后你的SericesA会看:
class ServiceA : IServiceA
{
public ResultA Method1() { //some logic };
public void Method2() { //some logic };
}
依赖ServcieA的ServiceB。
class ServiceB: IServiceB
{
private IServiceA _serviceA;
public ServiceB(IServiceA serviceA)
{
_serviceA = serviceA;
}
public ResultB Method()
{
var result = _serviceA.Method1();
// get result from service A and create and return result for service B
}
}
答案 1 :(得分:0)
我倾向于依赖常用的原则和做法来做出这些决定;干(不要重复自己)和KISS(保持简单,愚蠢)可能适用于此。
除非您因绕过实体B的服务类而需要重复某些逻辑,否则我将直接从实体A的服务类调用实体B的存储库。
这是一个小细节,但它意味着涉及的课程少了一个(ServiceClassA> RepositoryClassB而不是ServiceClassA> ServiceClassB> RepositoryClassB),这使我觉得它更简单。
HTH
答案 2 :(得分:0)
你永远不应该混合这些。你有一个enity /文档,你应该有专门的存储库,服务,控制器。如果你想在任何地方使用任何特定于本文档的内容,它应该通过服务调用,而不是直接使用其他类的存储库。这在设计方面不是一个好习惯。