WebApi имеет контроллеры, которые вызывают бизнес-логику в домене через интерфейс IInteractor.
Код: Выделить всё
public interface IInteractor
{
Task Execute(TRequestModel model);
}
- принять веб-запрос
- преобразовать его в модель запроса
- вызвать интерактор через интерфейс IInteractor
- преобразовать модель ответа интерактора в DTO
и вернуть клиенту
Код: Выделить всё
[HttpGet(Name = nameof(GetFoobar))]
public async Task GetFoobar(
[FromServices] IInteractor getFoobar,
[FromQuery] string candidate
)
{
var requestModel = new GetFoobarRequestModel(candidate);
var result = await getFoobar.Execute(requestModel);
return result
.Match(
foobar => Ok(foobar),
notFound => NotFound());
}
Код: Выделить всё
public class GetFoobarInteractor : IInteractor
{ ... }
Код: Выделить всё
builder.RegisterAssemblyTypes(assemblyThatContainsInteractors)
.AsClosedTypesOf(typeof(IInteractor))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
Код: Выделить всё
builder.RegisterGenericDecorator(typeof(InteractorLoggingDecorator), typeof(IInteractor));
Но внедрение закрытого универсального интерфейса, например IInteractor немного громоздкий, так как его трудно читать.
Мне хотелось бы иметь более простой интерфейс, который усиливает бизнес-задачи .
Этого можно добиться путем введения интерфейса для каждого интерактора.
Код: Выделить всё
public interface IGetFoobar : IInteractor;
Код: Выделить всё
public class GetFoobarInteractor : IGetFoobar
{ ... }
Код: Выделить всё
[HttpGet(Name = nameof(GetFoobar))]
public async Task GetFoobar(
[FromServices] IGetFoobar getFoobar,
[FromQuery] string candidate
)
{ ... }
InteractorLoggingDecorator больше не вызывается.
Я думаю, что это это из-за .AsImplementedInterfaces(), поскольку он регистрирует конкретный интерактор для обоих интерфейсов
Код: Выделить всё
IGetFoobarКод: Выделить всё
IInteractor
Как зарегистрировать InteractorLoggingDecorator для всех интерфейсов по соглашениям?
Подробнее здесь: https://stackoverflow.com/questions/790 ... same-basis
Мобильная версия