Простой инжектор, открытый универсальный декоратор
Я пытаюсь использовать некоторые из приятных возможностей простого инжектора.
В настоящее время у меня проблемы с декораторами, они не получают удар, когда я их тоже ожидаю.
Я регистрирую их так:
container.RegisterManyForOpenGeneric(
typeof(ICommandHandler),
AppDomain.CurrentDomain.GetAssemblies());
container.RegisterDecorator(
typeof(ICommandHandler),
typeof(CreateValidFriendlyUrlCommandHandler),
context => context.ServiceType == typeof(ICommandHandler)
);
container.RegisterDecorator(
typeof(ICommandHandler),
typeof(CreateProductValidationCommandHandler),
context => context.ServiceType == typeof(ICommandHandler)
);
Я думаю, что я что-то упускаю, так как я ожидаю, что вызовICommandHandler
вызоветCreateValidFriendlyUrlCommandHandler
а такжеCreateProductValidationCommandHandler
перед запуском сам.
Я пробовал другую регистрацию, как это:
container.RegisterManyForOpenGeneric(
typeof(ICommandHandler),
AppDomain.CurrentDomain.GetAssemblies());
container.RegisterDecorator(
typeof(ICommandHandler),
typeof(CreateValidFriendlyUrlCommandHandler),
context => context.ImplementationType == typeof(CreateProductCommandHandler)
);
container.RegisterDecorator(
typeof(ICommandHandler),
typeof(CreateProductValidationCommandHandler),
context => context.ImplementationType == typeof(CreateProductCommandHandler)
);
Как я и думал, регистрация декоратора дляICommandHandler
по типуICommandHandler
когдаCreateProductValidationCommandHandler
а такжеCreateValidFriendlyUrlCommandHandler
воплощать в жизньICommandHandler
может ударить немного круговой ссылки.
Но изменение не имело значения.
Вот мой:CreateProductValidationCommandHandler
public class CreateProductValidationCommandHandler
: ICommandHandler
{
private readonly ICommandHandler decorated;
private readonly IValidationService validationService;
public CreateProductValidationCommandHandler(
ICommandHandler decorated,
IValidationService validationService)
{
this.decorated = decorated;
this.validationService = validationService;
}
public void Handle(CreateProductCommand command)
{
if (!validationService.IsValidFriendlyName(
command.Product.ProductFriendlyUrl))
{
command.ModelStateDictionary.AddModelError(
"ProductFriendlyUrl",
"The Friendly Product Name is not valid...");
return;
}
if (!validationService.IsUniqueFriendlyName(
command.Product.ProductFriendlyUrl))
{
command.ModelStateDictionary.AddModelError(
"ProductFriendlyUrl",
"The Friendly Product Name is ...");
return;
}
}
}
И это моеCreateValidFriendlyUrlCommandHandler
public class CreateValidFriendlyUrlCommandHandler
: ICommandHandler
{
private readonly ICommandHandler decorated;
public CreateValidFriendlyUrlCommandHandler(ICommandHandler decorated)
{
this.decorated = decorated;
}
public void Handle(CreateProductCommand command)
{
if (string.IsNullOrWhiteSpace(
command.Product.ProductFriendlyUrl))
{
command.Product.ProductFriendlyUrl =
MakeFriendlyUrl(command.Product.Name);
}
}
}