現在登録している依存関係に 1 つの依存関係を挿入しようとすると、問題が発生します。起動時にブートストラップローダーを初期化して設定ファイルから読み取り、この設定ファイルの特定の値からのリフレクションを使用してオブジェクトを作成するアプリケーションがあります。ここでコードに話させてみます。
設定ファイル
BootstrapSettings
設定ファイルはプレーンな古い XML ファイルであり、次のコントラクトに従って呼び出されるオブジェクトにシリアル化/逆シリアル化します。
public interface IBootstrapSettings
{
string Get(string key);
void Set(string key, string value);
}
この設定ファイル内には、IEncryptor
このアプリケーションで使用する予定のものを識別する特定のキーがあります。現時点ではPlainTextEncryptor
またはTDESEncryptor
を選択できます。後者は設定ファイルからパスフレーズを読み取るため、そのコンストラクターでインスタンスを渡しますofIBootstrapSettings
を使用して、設定ファイルからこのパスフレーズを読み取ります。現時点では、IBootstrapSettings
各暗号化プログラムに のインスタンスを挿入していますPlainTextEncryptor
が、使用していません。リフレクションを使用してこのインスタンスを作成する必要があり、パラメーターを取らないコンストラクターと型の作成時にパラメーターを取るコンストラクターを区別する方法がわからないため、これを行っていますIEncryptor
(ただし、これは別の質問です)。私は考えます)。
IEncryptor コンストラクター
IEncryptor
以下は、私が現在持っているそれぞれのコンストラクターです。
public sealed class PlainTextEncryptor : IEncryptor
{
private readonly IBootstrapSettings _bootstrapSettings;
public PlainTextEncryptor(IBootstrapSettings bootstrapSettings)
{
_bootstrapSettings = bootstrapSettings;
}
}
public sealed class TDESEncryptor : IEncryptor
{
private readonly IBootstrapSettings _bootstrapSettings;
public TDESEncryptor(IBootstrapSettings bootstrapSettings)
{
_bootstrapSettings = bootstrapSettings;
}
}
注入
依存関係の設定方法について。他のものが作成される前にブートストラップの依存関係を作成する Autofac モジュールがあります。次のようになります。
public sealed class BootstrapSettingsModule : Autofac.Module
{
private readonly string _filePath;
public BootstrapSettingsModule(string filePath)
{
_filePath = filePath;
}
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.Register(c => new BootstrapSettings(_bootstrapSettingsPath))
.As<IBootstrapSettings>()
.SingleInstance();
builder.Register(c => (IEncryptor)Activator.CreateInstance(Type.GetType(c.Resolve<IBootstrapSettings>().Get("encryptionprovider")), args: new { bootstrapSettings = c.Resolve<IBootstrapSettings>() }))
.As<IEncryptor>()
.SingleInstance();
}
}
これで問題なく実行され、 I am gets the error Constructor on type 'whatever encryptor type' not found.Resolve
のインスタンスを実行しようとすると問題が発生します。これは、Autofac が私を解決できず、デフォルトのパラメーターなしのコンストラクターがないため、フィットをスローしているためだと思います。IEncryptor
IBootstrapSettings
IEncryptor
私はここで何をすべきかIBootstrapSettings
について少し途方に暮れています.1つのインスタンスとして指定することで何か間違ったことをしていますか...またはAutofacのバインディングを正しく理解していませんか? いつものようにどんな助けにも感謝します!