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

KTO*_*TOV 6 c# service repository-pattern

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

控制器 > 服务 > 存储库

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

假设我有 2 个实体ProductPage就像这样:

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

public class Page
{
   public string Name { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class PageRepository
{
   public Product GetPage(int pageId)
   {
      // code
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class PageService
{
   public bool CreatePage (int productId, PageRequest page)
   {
      // code
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

方法一

我应该注入ProductServicePageService使用DoesProductExist()的方法,因为可重用的代码?

方法二

我应该注入ProductRepository到我PageService,使我自己的DoesProductExist()方法PageService(击败的可重用代码的想法)

方法三

我应该创建一个类似的跨服务ProductPageService来实现这两种服务吗?

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

Hen*_*man 5

注射只是工具。

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

主要答案是否定的,那很好。

你应该注意的是依赖关系。例如,将 BLL 服务注入 DAL 会很糟糕。您需要清楚地了解层/层/模块,并划清谁使用谁的界限。

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

  • 另一件需要考虑的事情是循环依赖。当服务B想要使用服务A但同时服务A使用服务B时 (4认同)

Cos*_*ntu 5

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

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

  • 方法 3 这是最好的方法,但我不会说“实现这两种服务”,而是“与这两种服务交互/编排这两种服务”。您可以提取 IProductService 和 IPageService 接口并将它们注入到您的“跨服务”中。这样就可以避免耦合。您还可以使用此方法(将 IProductService 注入 PageService)作为方法 1。