2013-04-02 19 views
11

サービスはDefaultFooで実装されていますが、私はそれを自分のautofacコンテナに登録しました。プラグインによるautofac登録のオーバーライド

IFooの代替実装を、プラグインアセンブリに実装することを許可します。このプラグインアセンブリは、「プラグイン」フォルダにドロップできます。この代替実装がある場合は、autofacをどのように設定するのですか?

答えて

11

一部のインターフェイス実装を登録すると、Autofacは最新の登録を使用します。他の登録は無効になります。あなたのケースでは、プラグインが存在する場合、Autofacはプラグイン登録を使用し、独自のIFooサービス実装を登録します。

複数のコンポーネントが同じサービスを公開している場合、Autofacは最後に登録されたコンポーネントをそのサービスのデフォルトプロバイダとして使用します。

Memoizerで述べたようにDefault Registrations

+0

これは予期しない動作ですか、それとも偶然ですか?あなたは参考文献を持っていますか? –

+2

これは期待通りです: http://docs.autofac.org/en/latest/register/registration.html#default-registrations –

+1

他の登録は上書きされないことに注意してください。 Autofacは最後に登録されたコンポーネントを使用しますが、以前のコンポーネントを解決することができます(Resolve >) –

1

を参照してください、最新の登録は、以前のものを上書きします。私はこのような何かで終わった:

// 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); 
+0

_default_の登録を_test_のカウンターパートでオーバーライドできるので、テストに非常に便利です。 – t3chb0t

関連する問題