我正在使用 Simple Injector 为电子商务项目构建一个插件系统。我用来注册 a和 a 的RegisterAll
所有实现(以及更多)。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;
}
如何在没有丑陋开关的情况下将这些注册为单例?