4

我可以在运行时使用 SimpleInjector 为泛型类型注册初始化程序吗?(见下面最后一行代码)

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));
        }
    }
}
4

1 回答 1

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,您只需要一个注册。

但老实说,您应该非常小心地应用属性注入,因为这会导致难以验证的容器配置。在将依赖项注入构造函数时,容器会在缺少依赖项时抛出异常。另一方面,使用属性注入,会简单地跳过缺少的依赖项,并且不会引发异常。出于这个原因,InjectProperties 方法在 v2.6 中已被弃用。请检查您的策略。也许你应该重新考虑。如果您有疑问并希望对您的设计提供一些反馈;在 Stackoverflow 上发布一个新问题。

于 2012-12-05T10:11:43.293 回答