Do sau:Autofac - Đăng ký nhiều trang trí
public interface ICommandHandler<in TCommand>
{
void Handle(TCommand command);
}
public class MoveCustomerCommand
{
}
public class MoveCustomerCommandHandler : ICommandHandler<MoveCustomerCommand>
{
public void Handle(MoveCustomerCommand command)
{
Console.WriteLine("MoveCustomerCommandHandler");
}
}
public class TransactionCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> _decorated;
public TransactionCommandHandlerDecorator(ICommandHandler<TCommand> decorated)
{
_decorated = decorated;
}
public void Handle(TCommand command)
{
Console.WriteLine("TransactionCommandHandlerDecorator - before");
_decorated.Handle(command);
Console.WriteLine("TransactionCommandHandlerDecorator - after");
}
}
public class DeadlockRetryCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> _decorated;
public DeadlockRetryCommandHandlerDecorator(ICommandHandler<TCommand> decorated)
{
_decorated = decorated;
}
public void Handle(TCommand command)
{
Console.WriteLine("DeadlockRetryCommandHandlerDecorator - before");
_decorated.Handle(command);
Console.WriteLine("DeadlockRetryCommandHandlerDecorator - after");
}
}
tôi có thể trang trí MoveCustomerCommandHandler
với một TransactionCommandHandlerDecorator
sử dụng đoạn mã sau:
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(MoveCustomerCommandHandler).Assembly)
.As(type => type.GetInterfaces()
.Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(ICommandHandler<>)))
.Select(interfaceType => new KeyedService("commandHandler", interfaceType)));
builder.RegisterGenericDecorator(
typeof(TransactionCommandHandlerDecorator<>),
typeof(ICommandHandler<>),
fromKey: "commandHandler");
var container = builder.Build();
var commandHandler = container.Resolve<ICommandHandler<MoveCustomerCommand>>();
commandHandler.Handle(new MoveCustomerCommand());
nào sẽ ra:
TransactionCommandHandlerDecorator - before
MoveCustomerCommandHandler
TransactionCommandHandlerDecorator - after
Làm thế nào tôi cũng có thể trang trí TransactionCommandHandlerDecorator
với số DeadlockRetryCommandHandlerDecorator
, để tạo đầu ra sau đây
DeadlockRetryCommandHandlerDecorator- before
TransactionCommandHandlerDecorator - before
MoveCustomerCommandHandler
TransactionCommandHandlerDecorator - after
DeadlockRetryCommandHandlerDecorator- after
Câu hỏi bổ sung cho các điểm bổ sung: làm thế nào để bạn đăng ký một trang trí có điều kiện trong Autofac, ví dụ dựa trên một ràng buộc loại chung? – Steven
@Steven tốt câu hỏi, và tôi không có ý tưởng :) Đây là lần đầu tiên tôi đã sử dụng tính năng trang trí trong Autofac để trả lời câu hỏi này, vì vậy tôi phải nhìn nó lên nhưng tôi đoán impletation mặc định không phải là linh hoạt để cung cấp điều kiện, nhưng bạn luôn có thể viết «IRegistrationSource' của riêng mình ... nhưng tôi đoán có một cách đơn giản để thực hiện điều này trong SimpleInjector;) – nemesv
Tôi hỏi điều này vì tôi thường nhận được câu hỏi từ những người muốn áp dụng các mẫu này sử dụng các thùng chứa khác ngoài Simple Injector, nhưng tiếc là tôi không thể cung cấp cho họ câu trả lời hay - ngoại trừ tất nhiên lời khuyên để sử dụng Simple Injector :-). Nhưng có bạn là đúng, đây là một khu vực mà Simple Injector thực sự tỏa sáng. – Steven