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>。これにより、すべてのサンプル タイプに対して 1 つのデリゲートを登録するだけで済みます。

public interface ISample { }

public abstract class Sample<T> : ISample { }

public void Bootstrapper(Container container)
{
    container.RegisterInitializer<ISample>(
        instance => container.InjectProperties(instance));
}

RegisterInitializerは を実装するすべての型に適用されるため、ISample登録は 1 つだけで済みます。

しかし正直なところ、プロパティ インジェクションの適用には細心の注意を払う必要があります。これは、確認が難しいコンテナー構成につながるためです。依存関係をコンストラクターに注入する場合、依存関係が見つからない場合、コンテナーは例外をスローします。一方、プロパティ注入では、欠落している依存関係は単純にスキップされ、例外はスローされません。このため、InjectProperties メソッドは v2.6 で廃止されました。戦略を見直してください。考え直したほうがいいのではないでしょうか。疑問があり、デザインに関するフィードバックが必要な場合。Stackoverflow に新しい質問を投稿してください。

于 2012-12-05T10:11:43.293 に答える