Является ли внедрение услуг в другой сервис плохой практикой? - PullRequest
1 голос
/ 12 июня 2019

Я создаю веб-приложение с многоуровневой структурой следующим образом:

Контроллер> Служба> Репозиторий

Таким образом, оно следует шаблону службы и репозитория.

Давайтескажем, у меня есть 2 сущности Product и Page примерно так:

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 ]

1 голос
/ 12 июня 2019
  • Метод 1, как он есть, создаст зависимость между вашими сервисами.

  • Способ 2 Не рекомендуется смешивать репозитории между сервисами.

  • Метод 3 - это лучший способ, но вместо «реализации обеих служб» я бы сказал «взаимодействовать с обеими службами / управлять ими». Вы можете извлечь интерфейсы IProductService и IPageService и внедрить их в свой «кросс-сервис». Таким образом, вы избегаете сцепления. Вы также можете использовать этот подход (внедрение IProductService в PageService) для метода 1.
1 голос
/ 12 июня 2019

Инъекция - это всего лишь инструмент.

Является ли внедрение услуг в другую службу плохой практикой?

Основной ответ - Нет, это нормально.

На что следует обратить внимание - это зависимости.Например, было бы ужасно внедрить службу BLL в DAL.Вам нужна четкая картина слоев / ярусов / модулей и нарисуйте линии кто использует кто.

Но ваша цепь выглядит нормально.

...