SimpleInjector可以在运行时为泛型类型注册初始化程序吗?

时间:2012-12-05 00:08:32

标签: c# dependency-injection inversion-of-control simple-injector

我可以在运行时使用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));
        }
    }
}

1 个答案:

答案 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发布一个新问题。

相关问题