私は2つのデコレータを持っています:
class DbCommandWithTransactionHandlerDecorator<TCommand>
: IDbCommandHandler<TCommand> { ... }
class DbOptimisticConcurrencyRetryDecorator<TCommand>
: IDbCommandHandler<TCommand> { ... }
これらのデコレータは、トランザクション管理と楽観的同時実行再試行機能をデータベースコマンドに追加します。
IoCコンテナとしてAutofacを使用しています。AutofacをセットアップIDbCommandHandler<>
して、アセンブリ内にあるすべてのものを自動配線します。たとえば、を要求すると、最初に、、次に。IDbCommandHandler<CreateNewNotificationCommand>
で自動的に装飾されます。DbCommandWithTransactionHandlerDecorator
DbOptimisticConcurrencyRetryDecorator
Autofacでこれを取得しようとしていますbuilder.RegisterGenericDecorator()
が、まだ管理していません。主な問題は、デコレータが機能するために「名前付き」引数が必要なことです。以下は、私が達成したいものに最も「近い」サンプルコードです-しかし、主な欠陥は、私がまだタイプを手動で登録しなければならなかったことです。
var builder = new ContainerBuilder();
var a = Assembly.GetExecutingAssembly();
// I need to find a way how these can be 'auto-wired',
// rather than having to manually wire each command.
builder.RegisterType<CreateNewNotificationCommandHandler>()
.Named<IDbCommandHandler<CreateNewNotificationCommand>>("command");
builder.RegisterType<CreateNewNotificationCommandHandler_2>()
.Named<IDbCommandHandler<CreateNewNotificationCommand_2>>("command");
builder.RegisterGenericDecorator(
typeof(DbCommandWithTransactionHandlerDecorator<>),
typeof(IDbCommandHandler<>),
fromKey: "command");
var container = builder.Build();
var handler1 =
container.Resolve<IDbCommandHandler<CreateNewNotificationCommand>>();
var handler2 =
container.Resolve<IDbCommandHandler<CreateNewNotificationCommand_2>>();
handler1.Handle(null); //these are correctly decorated
handler2.Handle(null); //these are correctly decorated