10

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

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

4

3 回答 3

5

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

然后您的 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
    }
}
于 2012-07-24T07:41:26.510 回答
1

对于这类决定,我倾向于使用常用的原则和实践;DRY(不要重复自己)和 KISS(保持简单,愚蠢)可能适用于此。

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

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

高温高压

于 2012-07-23T12:29:11.503 回答
0

你不应该混合这些。你有一个实体/文档,你应该有专门的存储库、服务、控制器。如果您想在任何地方使用此文档的任何特定内容,则应通过服务调用进行,而不是直接使用其他类的存储库。就设计而言,这不是一个好的做法。

于 2018-03-15T03:00:18.473 回答