サービスはDefaultFoo
で実装されていますが、私はそれを自分のautofacコンテナに登録しました。プラグインによるautofac登録のオーバーライド
IFoo
の代替実装を、プラグインアセンブリに実装することを許可します。このプラグインアセンブリは、「プラグイン」フォルダにドロップできます。この代替実装がある場合は、autofacをどのように設定するのですか?
サービスはDefaultFoo
で実装されていますが、私はそれを自分のautofacコンテナに登録しました。プラグインによるautofac登録のオーバーライド
IFoo
の代替実装を、プラグインアセンブリに実装することを許可します。このプラグインアセンブリは、「プラグイン」フォルダにドロップできます。この代替実装がある場合は、autofacをどのように設定するのですか?
一部のインターフェイス実装を登録すると、Autofacは最新の登録を使用します。他の登録は無効になります。あなたのケースでは、プラグインが存在する場合、Autofacはプラグイン登録を使用し、独自のIFooサービス実装を登録します。
複数のコンポーネントが同じサービスを公開している場合、Autofacは最後に登録されたコンポーネントをそのサービスのデフォルトプロバイダとして使用します。
Memoizerで述べたようにDefault Registrations
を参照してください、最新の登録は、以前のものを上書きします。私はこのような何かで終わった:
// gather plugin assemblies
string applicationPath = Path.GetDirectoryName(
Assembly.GetEntryAssembly().Location);
string pluginsPath = Path.Combine(applicationPath, "plugins");
Assembly[] pluginAssemblies =
Directory.EnumerateFiles(pluginsPath, "*.dll")
.Select(path => Assembly.LoadFile(path))
.ToArray();
// register types
var builder = new ContainerBuilder();
builder.Register<IFoo>(context => new DefaultFoo());
builder.RegisterAssemblyTypes(pluginAssemblies)
.Where(type => type.IsAssignableTo<IFoo>())
.As<IFoo>();
// test which IFoo implementation is selected
var container = builder.Build();
IFoo foo = container.Resolve<IFoo>();
Console.WriteLine(foo.GetType().FullName);
_default_の登録を_test_のカウンターパートでオーバーライドできるので、テストに非常に便利です。 – t3chb0t
これは予期しない動作ですか、それとも偶然ですか?あなたは参考文献を持っていますか? –
これは期待通りです: http://docs.autofac.org/en/latest/register/registration.html#default-registrations –
他の登録は上書きされないことに注意してください。 Autofacは最後に登録されたコンポーネントを使用しますが、以前のコンポーネントを解決することができます(Resolve>) –