将服务注入另一个服务是不好的做法吗?

Is injecting service into another service bad practice?

我正在创建一个按以下方式分层的 Web 应用程序:

控制器 > 服务 > 存储库

所以它遵循服务和存储库模式。

假设我有 2 个实体 ProductPage,如下所示:

public class Product
{
   public string Name { get; set;}
   public Page Page { get; set; )
}

public class Page
{
   public string Name { get; set;}
}

这些实体中的每一个都有一个存储库,如下所示:

public class ProductRepository
{
   public Product GetProduct(int productId)
   {
      // code
   }
}

public class PageRepository
{
   public Product GetPage(int pageId)
   {
      // code
   }
}

当然,这些存储库中的每一个都有一个存储库将被注入的服务:

public class ProductService
{
   public bool DoesProductExist (int productId)
   {
      // code
   }
}

public class PageService
{
   public bool CreatePage (int productId, PageRequest page)
   {
      // code
   }
}

我现在遇到的问题是,当调用 PageService 创建页面时,它需要检查给定的 productId 是否存在产品,因为如果不存在,那么页面应该'被创建。

我有以下方法,但我不知道它们是否是最好的方法,或者是否有更好的方法

方法一

我是否应该将 ProductService 注入 PageService 以使用 DoesProductExist() 方法,因为可重用代码?

方法二

我是否应该将 ProductRepository 注入我的 PageService 以在 PageService 中创建我自己的 DoesProductExist() 方法(打败可重用代码的想法)

方法三

我是否应该创建一个类似 ProductPageService 的交叉服务来实现这两种服务?

如果这些都不是好的方法,请随时提出您自己的方法

注入只是工具。

Is injecting service into another service bad practice?

主要答案是否定的,没关系。

你要注意的是Dependencies。例如,将 BLL 服务注入 DAL 会很糟糕。您需要清楚地了解 layers/tiers/modules 并划清谁使用谁的界线。

但是你的链条看起来还不错。

  • 方法 1 原样,它会在您的服务之间创建依赖关系。

  • 方法 2 在服务之间混合存储库不是一个好的做法。

  • 方法 3 是最好的方法,但我会说 "interact with / orchestrate both services" 而不是 "implement both services"。您可以提取 IProductService 和 IPageService 接口并将它们注入您的 "cross service"。这样你就避免了耦合。您也可以将此方法(将 IProductService 注入 PageService)用于方法 1。