实体服务类是否应该调用另一个实体的服务或其存储库

时间:2011-09-04 15:33:11

标签: repository service-layer

我正在开发一个分层的ASP.Net MVC 3 Web应用程序(EF 4.1):模型,存储库,服务,控制器,某些情况下的ViewModel和视图。

现在我的问题是最好的做法之一。需要访问另一个实体的实体服务类是否应使用其服务或其存储库。例如,假设实体A的服务方法需要在创建A时更新实体B. A的服务类应该使用B的存储库还是服务层?两者都有可能,但最佳做法是什么?就个人而言,我更喜欢一项服务来访问另一项服务。这样,它可以作为访问更多进化方法的说法。

3 个答案:

答案 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 /文档,你应该有专门的存储库,服务,控制器。如果你想在任何地方使用任何特定于本文档的内容,它应该通过服务调用,而不是直接使用其他类的存储库。这在设计方面不是一个好习惯。