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

Jea*_*amp 8 repository service-layer

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

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

Mar*_*Ban 5

我更喜欢在服务类之间调用,因为您可能还需要来自另一个服务的一些业务逻辑。但要小心避免循环依赖。我建议您使用依赖注入,这将帮助您避免可能的循环依赖。还要考虑为您的服务类创建接口并从您的客户端类使用这个接口(将具体实现传递给构造函数)。

然后您的 SericesA 将如下所示:

class ServiceA : IServiceA
{
    public ResultA Method1() { //some logic };
    public void Method2() { //some logic };
}
Run Code Online (Sandbox Code Playgroud)

ServiceB 依赖于 ServcieA。

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
    }
}
Run Code Online (Sandbox Code Playgroud)


Tep*_*pic 1

我倾向于依靠常用的原则和实践来做出此类决策;DRY(不要重复自己)和 KISS(保持简单,愚蠢)在这里可能适用。

除非您需要由于绕过实体 B 的服务类而重复某些逻辑,否则我会直接从实体 A 的服务类调用实体 B 的存储库。

这是一个小细节,但这意味着少涉及一个类(ServiceClassA > RepositoryClassB 而不是 ServiceClassA > ServiceClassB > RepositoryClassB),这使得它在我看来是一个更简单的解决方案。

华泰