将服务注入另一种服务做法是否不好?

时间:2019-06-11 22:02:47

标签: c# service repository

我正在创建通过以下方式分层的Web应用程序:

Controller> Service>存储库

因此,它遵循服务和存储库模式。

假设我有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是否存在某种产品,因为如果不存在,则该页面不应该被创建。

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

方法1

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

方法2

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

方法3

我是否应该创建像ProductPageService这样的交叉服务来实现这两种服务?

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

2 个答案:

答案 0 :(得分:1)

注入只是工具。

  

将服务注入另一种服务不良做法吗?

主要回答是“否”,这很好。

您应注意的是依赖项。例如,将BLL服务注入DAL太糟糕了。您需要清楚地了解层/层/模块,并划定谁使用谁的路线。

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

答案 1 :(得分:0)

  • 方法1不变,它将在您的服务之间创建依赖关系。

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

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