Simple Injector を使用して、e コマース プロジェクト用のプラグイン システムを構築しています。私はaとRegisterAll
a のすべての実装を登録するために使用しています(およびさらに多くの場合)。IPaymentProvider
IResourceRegistrar
しかし、これは毎回新しいインスタンスを作成します。ここでは、RegisterSingle
タイプごとに使用することをお勧めします。しかし、この場合、これをどのように達成するのでしょうか?
private static void RegisterMultipleUnderOneInterface(
Container container, string name)
{
IEnumerable<Type> pluginRegistrations =
from dll in finder.Assemblies
from type in dll.GetExportedTypes()
where type.GetInterfaces().Any(i => i.Name == name)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
select type;
if (pluginRegistrations.Any())
{
var @interface =
pluginRegistrations.ElementAt(0).GetInterfaces()
.First(i => i.Name == name);
foreach (Type type in pluginRegistrations)
{
// HERE: register the type single somehow.
}
container.RegisterAll(@interface, pluginRegistrations);
}
}
container.RegisterSingle(type)
IPaymentProvider
同じインターフェイス (または)に固有の型であるため、機能しませんIResourceRegistrar
。IPaymentProvider
実装クラスには、パラメーターなしのコンストラクター (パラメーターあり) がありIResourceRegistrar
ます。
私はこのようなことをしたくありません。むしろ、IoC コンテナーの目的を無効にします。
var constructor = type.GetConstructors()[0];
switch (name)
{
case "IResourceRegistrar":
container.RegisterSingle(type, () =>
{
return constructor.Invoke(new object[
{
container.GetInstance<ILanguageService>()});
});
break;
case "IPaymentProvider":
default:
container.RegisterSingle(type, () =>
{
return constructor.Invoke(new object[] { });
});
break;
}
これらを醜いスイッチなしでシングルトンとして登録する方法は?