0

多くの派生インターフェイス IDerived1、IDerived2 を持つインターフェイス IBase があります。Autofac を使用して派生インターフェイスの実装を登録したいと考えています。

派生インターフェースがあれば、そのインターフェースの解決メソッドを作成できます。私が疑問に思っているのは、コンテナを構築するときにすべての派生インターフェイスのリストを列挙することを避ける方法はありますか?

私が今持っているものは次のとおりです。

public static void Register<TDerived>(ContainerBuilder b) where TDerived : IBase {
    b.Register(cc => DerivedFactory.Create<TDerived>(cc.Resolve<SomeDependency>())
     .As<TDerived>()
     .InstancePerLifetimeScope();
}

// in my registration method
ContainerBuilder b = ...
MethodInfo genericRegisterDerivedMethod = this.GetType().GetMethod("Register", BindingFlags.Public | BindingFlags.Static);
List<Type> allDerivedInterfaces = /* query across various assemblies for interfaces which extend IBase */

allDerivedInterfaces.ForEach(t => genericRegisterDerivedMethod 
    .MakeGenericMethod(t)
    .Invoke(null, new object[] { b })
);

私がしたいのは:

public static void Create<TDerived>(IComponentContext cc) where TDerived : IBase {
    return DerivedFactory.Create<TDerived>(cc.Resolve<SomeDependency>());
}

// in my registration method
ContainerBuilder b = ...
MethodInfo genericResolveDerivedMethod = this.GetType().GetMethod("Create", BindingFlags.Public | BindingFlags.Static);

b.RegisterDerivedTypesOf<IBase>((cc, t) => (IBase)genericResolveDerivedMethod
    .MakeGenericMethod(t)
    .Invoke(null, new object[] { cc, t })
);

これにより、アプリケーションの起動時に IDerived インターフェイスの完全なリストを知る必要がなくなります。これは可能ですか?

4

1 に答える 1