Выполнение препроцессора Mediatr только для конкретных типов интерфейса (команды)C#

Место общения программистов C#
Ответить
Anonymous
 Выполнение препроцессора Mediatr только для конкретных типов интерфейса (команды)

Сообщение Anonymous »

[ Примечание: Это «замена». Первый был основан на коде моего основного проекта, поэтому я переделал вопрос с кодом из одноцелевого проекта, который иллюстрирует принцип более чисто. Вопрос остается прежним, просто лучше представлен.]
сценарий
Я пытаюсь настроить предварительный процессор команды на конвейере запроса CQRS, используя поведения в области конвейера Mediatr и Autofac для маршрутизации запроса. Моя цель состоит в том, чтобы препроцессор запустил только для команд (ICOMMAND ), в отличие от всех запросов (IREQUEST ), что приведет к выполнению допроцессора для команд, запросов и событий. Чтобы попытаться «отфильтровать» инъекцию либо возвращает ошибку, либо просто не выполняет желаемый предварительный процесс.

Код: Выделить всё

// Pipeline pre/post processors
builder
.RegisterGeneric(typeof(RequestPostProcessorBehavior))
.As(typeof(IPipelineBehavior));

builder
.RegisterGeneric(typeof(RequestPreProcessorBehavior))
.As(typeof(IPipelineBehavior));

// Works as desired: Fires generic pre-processor for ALL requests, both cmd and query
builder
.RegisterGeneric(typeof(GenericRequestPreProcessor))
.As(typeof(IRequestPreProcessor));

// Works for all requests, but I need a way to limit it to commands
builder
.RegisterGeneric(typeof(MyCommandPreProcessor))
.As(typeof(IRequestPreProcessor));
< /code>
Концептуально я пытаюсь сделать что -то вроде любого из них, что терпит неудачу: < /p>
builder
.RegisterGeneric(typeof(MyCommandPreProcessor)) // Note generic
.As(typeof(IRequestPreProcessor));
// Intellisense error "Unexpected use of an unbound generic"

builder
.RegisterType(typeof(MyCommandPreProcessor)) // Note non-generic
.As(typeof(IRequestPreProcessor));
// Intellisense error "Unexpected use of an unbound generic"

builder
.RegisterType(typeof(MyCommandPreProcessor)) // Note non-generic
.As(typeof(IRequestPreProcessor));
// No errors, but MyCommandPreProcessor not firing
< /code>
Я пробую пару различных конфигураций для mycommandpreprocessor, универсального и негенерического, но я в тупике: < /p>
public class MyCommandPreProcessor : IRequestPreProcessor
{
public Task Process(TRequest request, CancellationToken cancellationToken)
{
Debug.WriteLine("***** MYCOMMAND PREPROCESSOR CALLED *****");
return Task.CompletedTask;
}
}

- OR -

public class MyCommandPreProcessor : IRequestPreProcessor
{
public Task Process(TRequest request, CancellationToken cancellationToken)
{
Debug.WriteLine("***** MYCOMMAND PREPROCESSOR CALLED *****");
return Task.CompletedTask;
}
}
Мой вопрос
Любые идеи о том, как я могу зарегистрировать препроцессор, который будет ограничен только огнем для iRequest , которые являются закрытыми типами ICOMMAND ? /> Весь минимальный образцевой проект можно просмотреть или клонировать по адресу https://github.com/jhoiby/mediatrpreprocessortestbr/> confige mediatr ​​.

Код: Выделить всё

        builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();

var mediatrOpenTypes = new[]
{
typeof(IRequestHandler),
typeof(IRequestHandler),
typeof(INotificationHandler)
};

foreach (var mediatrOpenType in mediatrOpenTypes)
{
// Register all command handler in the same assembly as WriteLogMessageCommandHandler
builder
.RegisterAssemblyTypes(typeof(MyCommandHandler).GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
.AsImplementedInterfaces();

// Register all QueryHandlers in the same assembly as GetExternalLoginQueryHandler
builder
.RegisterAssemblyTypes(typeof(MyQueryHandler).GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
.AsImplementedInterfaces();
}

// Pipeline pre/post processors
builder.RegisterGeneric(typeof(RequestPostProcessorBehavior)).As(typeof(IPipelineBehavior));
builder.RegisterGeneric(typeof(RequestPreProcessorBehavior)).As(typeof(IPipelineBehavior));
builder.RegisterGeneric(typeof(GenericRequestPreProcessor)).As(typeof(IRequestPreProcessor));
// builder.RegisterGeneric(typeof(GenericRequestPostProcessor)).As(typeof(IRequestPostProcessor));
// builder.RegisterGeneric(typeof(GenericPipelineBehavior)).As(typeof(IPipelineBehavior));

builder.Register(ctx =>
{
var c = ctx.Resolve();
return t =>  c.Resolve(t);
});

builder.Register(ctx =>
{
var c = ctx.Resolve();
return t => (IEnumerable)c.Resolve(typeof(IEnumerable).MakeGenericType(t));
});
mycommandpreprocessor class
Я экспериментирую с обоими из них, универсальными и негенерическими:

Код: Выделить всё

public class MyCommandPreProcessor : IRequestPreProcessor
{
public Task Process(TRequest request, CancellationToken cancellationToken)
{
Debug.WriteLine("***** MYCOMMAND PREPROCESSOR CALLED *****");
return Task.CompletedTask;
}
}

- AND -

public class MyCommandPreProcessor : IRequestPreProcessor
{
public Task Process(TRequest request, CancellationToken cancellationToken)
{
Debug.WriteLine("***** MYCOMMAND PREPROCESSOR CALLED *****");
return Task.CompletedTask;
}
}
структуры наследования

Код: Выделить всё

// Requests

IMediatR.IRequest


Подробнее здесь: [url]https://stackoverflow.com/questions/48045989/executing-mediatr-preprocessor-only-for-specific-interface-types-commands[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»