У меня есть базовый проект, в котором у меня есть общий код, который будет использоваться несколькими дочерними проектами. Например, скажем, у меня есть интерфейс 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>();