1

現在登録している依存関係に 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 が私を解決できず、デフォルトのパラメーターなしのコンストラクターがないため、フィットをスローしているためだと思います。IEncryptorIBootstrapSettingsIEncryptor

私はここで何をすべきかIBootstrapSettingsについて少し途方に暮れています.1つのインスタンスとして指定することで何か間違ったことをしていますか...またはAutofacのバインディングを正しく理解していませんか? いつものようにどんな助けにも感謝します!

4

1 に答える 1

2

Autofac の機能だけを使用していない理由がわかりません。

protected override void Load(ContainerBuilder builder)
{
    base.Load(builder);

    var settings = new BootstrapSettings(_bootstrapSettingsPath);
    builder.RegisterInstance(settings)
        .As<IBootstrapSettings>()
        .SingleInstance();

    var encryptorType = Type.GetType(settings.Get("encryptionprovider"));
    builder.RegisterType(encryptorType)
        .As<IEncryptor>()
        .SingleInstance();
}

IBootstrapSettingsこれにより、すべての暗号化プログラムでパラメーターを持つコンストラクターを使用する必要がないという追加の利点が得られます。そのパラメーターを実際に利用する場合にのみ必要になります。

于 2012-10-10T10:38:02.123 に答える