Разрешить службу в качестве родителя из общего проекта при регистрации только дочерней службы - PullRequest
0 голосов
/ 11 октября 2019

У меня есть базовый проект, в котором у меня есть общий код, который будет использоваться несколькими дочерними проектами. Например, скажем, у меня есть интерфейс IBaseUnitOfWork и его реализация BaseUnitOfWork в общем проекте, который обрабатывает несколько общих задач.

namespace MyProject.Base 
{
  public interface IBaseUnitOfWork
  {
    ...
   }
}

namespace MyProject.Base 
{
  public class UnitOfWork : IBaseUnitOfWork
  {
    ...
  }
}

У меня также есть одна общая задача, которая будет использовать некоторые функции из BaseUnitOfWork .

namespace MyProject.Base
{
  public class CommonTasks
  {
    private void PublishPendingIntegrationEvents()
    {
      using (IServiceScope scope = _scopeFactory.CreateScope())
      {
       // need to resolve from child projects unit of work injected
        var unitOfWork = scope.ServiceProvider.GetService<IBaseUnitOfWork>();
      }
    }
  }    
}

И у меня есть несколько микроуслуг, которые ссылаются на эту общуюпроект.

Скажем, у меня есть проект EmployeeManagement WebAPI, который имеет интерфейс IEmployeeUnitOfWork, который наследуется от IBaseUnitOfWork (из общего проекта), и реализацию EmployeeUnitOfWork, которая реализует IEmployeeUnitOfWork.

1012. * Я знаю, что могу зарегистрировать родительский сервис IBaseUnitOfWork в Startup of EmployeeManagement и использовать это в моем общем проекте:
services.AddScoped<IBaseUnitOfWork, EmployeeUnitOfWork>();

И аналогично, при запуске второго проекта API.

services.AddScoped<IBaseUnitOfWork, DepartmentUnitOfWork>();

Но вместо этого я могу зарегистрировать дочернюю службу только в соответствующих дочерних проектах и ​​соответственно разрешить ее в моем общем проекте, при этом родительский проект не должен знать о существовании дочерних элементов?

Вместо этого я регистрируюсь так:

Управление персоналом

services.AddScoped<IEmployeeUnitOfWork, EmployeeUnitOfWork>();

Управление отделом

services.AddScoped<IDepartmentUnitOfWork, DepartmentUnitOfWork>(); 

Разрешитьэто в общем проекте с использованием, возможно, другого метода вместо GetService в Service Providerили используя другой способ регистрации службы в дочернем классе, который позволит мне сделать это:

var unitOfWork = scope.ServiceProvider.GetService<IBaseUnitOfWork>();
...