3

ジェネリック抽象型パラメーターを使用して、リフレクションを使用して具象派生型のインスタンスを返すファクトリメソッドを作成中です。たとえば。

public abstract class ServiceClientBase : IServiceClient
{
}

public abstract class Channel : ServiceClientBase
{
}

public class ChannelImpl : Channel
{
}

public class ServiceClientFactory
{
    public T GetService<T>() where T : class, IServiceClient
    {
        // Use reflection to create the derived type instance
        T instance = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null).Invoke(new object[] { endPointUrl }) as T;
    }
}

使用法:

Channel channelService = factory.GetService<Channel>();

問題は、ファクトリメソッドがメソッド内の抽象基本型に渡される派生型をインスタンス化するための洗練された方法を理解できないことです。私が思いつくことができる唯一のことは、抽象ベースと対応する派生クラスの間のマップを含む辞書を維持することですが、これはコードの臭いのように私には思えます。誰かがより良い解決策を提案できますか?

4

2 に答える 2

4

実装が1つしかないことを確信していて、それが同じアセンブリ内にあると仮定すると、リフレクションを介してそれを見つけることができます。例えば:

Type implementationType = typeof(T).Assembly.GetTypes()
                                   .Where(t => t.IsSubclassOf(typeof(T))
                                   .Single();
return (T) Activator.CreateInstance(implementationType);

もちろん、パフォーマンス上の理由から、抽象型から具象型へのキャッシュが必要になる場合があります。

複数の実装クラスがある場合は、別の方法を考える必要があります。1つのオプションは、可能であれば、どの実装を使用するかを示す抽象クラスの属性です。(これ以上のコンテキストがなければ、適切なオプションを提供することは困難です。)

于 2012-05-23T16:29:42.980 に答える
1

あなたはIOCコンテナを再発明しようとしているようです。たとえば、 Autofacを見てください。具象型をIOCコンテナに登録してから、インターフェースで要求します。

于 2012-05-23T16:34:37.097 に答える