DbContext
の実装に複数の接続文字列があるアプリケーションがあります。このクラスを消費するクラスでサポートするために、私は、を実装するGet
メソッドを使用して、DbContext
のインスタンスを提供するIDbContextProvider
インターフェイスを作成しました。シンプルなインジェクタデコレータと共分散
私もICommandHandler
のことが起こっています。コマンド実行に成功するとDbContext.SaveChangesAsync()
というデコレータを作成しようとしています。私はDbContext
実装における型パラメータを追加したくない、と私はDbContext
から派生したすべてのクラスがSaveChangesAsync()
方法を知っているので、私は、私を考え出し、今
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(SaveChangesCommandHandlerDecorator<>));
:私はこのように私のデコレータを登録しています共分散を使用することができます。だから私のインターフェースは次のようになります。
public public interface IDbContextProvider<out TDbContext> where TDbContext : DbContext
{
TDbContext Get(DbPrivileges privileges);
}
そして、私のデコレータの関連部分:しかし
public class SaveChangesCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
where TCommand : ICommand
{
private readonly ICommandHandler<TCommand> _handler;
private readonly IDbContextProvider<DbContext> _dbContextProvider;
public SaveChangesCommandHandlerDecorator(
ICommandHandler<TCommand> handler, IDbContextProvider<DbContext> dbContextProvider)
{
_handler = handler;
_dbContextProvider = dbContextProvider;
}
...
、私は私のコンテナにVerify()
を呼び出し、それは見ているようIDbContextProvider
は、無効であることを訴えます私のアプリに登録されているものの代わりに "ベース" IDbContextProvider<DbContext>
のために。
タイプのコンストラクタSaveChangesCommandHandlerDecorator < CreateUserCommand>名前のパラメータが含まれている 'dbContextProvider' とIDbContextProvider < DbContextを入力> registered.Please IDbContextProvider < DbContext>確実ではないことは、登録、またはSaveChangesCommandHandlerDecorator < CreateUserCommandのコンストラクタを変更しています>。要求された型が(Redacted).IDbContextProvider < Microsoft.EntityFrameworkCore.DbContext>の間に、別の型(Redacted).IDbContextProvider < TDbContextの登録が存在することに注意してください。
Simple Injectorは、dbContextProvider
パラメータに注入する具体的なタイプを知る方法がないため、実際には意味があります。
デコレータが作成される方法をカスタマイズする方法はありますか。基礎となるICommandHandler
実装の依存関係を調べてそこからIDbContextProvider
署名を作成することができますか?だから私のコマンドハンドラがIDbContextProvider<AwesomeDbContext>
なら、私はそれを私のデコレータでも解決したいと思っています。
これは私の質問を正しく要約し、詳細な答えをありがとう!私は収集ルートを考慮しませんでしたが、間違いなくよりきれいなコードを生成するので、私はそれに行きます。 –