我可以在运行时使用SimpleInjector注册Generic类型的初始值设定项吗? (见下面的最后一行代码)
public class BootStrapper
{
Type baseTypeGeneric = typeof(Sample<>);
public void BootStrap(Container container)
{
var types =
from type in Assembly.GetExecutingAssembly().GetTypes()
where type.Namespace == "NS.xyz"
select type;
foreach (Type type in types)
{
Type baseType = baseTypeGeneric.MakeGenericType(type);
if (type.BaseType == baseType)
{
container.Register(type);
}
//how do I get this line to work?
container.RegisterInitializer<Sample<[type]>>(
x => container.InjectProperties(x));
}
}
}
答案 0 :(得分:3)
解决方案实际上相当简单:在Sample<T>
上实现非通用接口。这允许您只为所有样本类型注册一个委托:
public interface ISample { }
public abstract class Sample<T> : ISample { }
public void Bootstrapper(Container container)
{
container.RegisterInitializer<ISample>(
instance => container.InjectProperties(instance));
}
由于RegisterInitializer
将适用于实施ISample
的所有类型,因此您只需要一次注册。
但说实话,你应该非常小心应用属性注入,因为这会导致容器配置难以验证。将依赖项注入构造函数时,容器将在缺少依赖项时抛出异常。另一方面,通过属性注入,可以简单地跳过缺少的依赖项,并且不会抛出异常。出于这个原因,v2.6中的InjectProperties method was deprecated。请检查您的策略。也许你应该重新考虑。如果您有疑问并喜欢对您的设计提出一些反馈意见;在Stackoverflow发布一个新问题。