その場合、TinyIoCのOpenGenerics機能を簡単に使用するだけで十分かもしれません。
public class Consumer
{
public Consumer(ILogger<Consumer> logger) {}
}
public interface ILogger<T>
{
string Log(string message);
}
public class ConcreteLogger<T>:ILogger<T>
{
public string Log(string message)
{
return string.Format("{0}: {1}", typeof (T), message);
}
}
そしてします
container.Register(typeof (ILogger<>), typeof (ConcreteLogger<>));
これにより、のインスタンスがコンストラクターConcreteLogger<Consumer>
に注入されます。Consumer
編集
ILogger
参照が必要な場合はILogger<T>
、「マーカーインターフェイス」のみを作成し、次の場所から「派生」させることができILogger
ます。
public interface ILogger<T> : ILogger
{
}
Consumer
クラスは引き続きに依存する必要がありますが、メンバーILogger<Consumer>
を直接ConcreteLogger<T>
実装します。ILogger
特にILogger
インターフェースが自分のものではないために固定されている場合は、これ以上の方法はありません。TinyIoCに現在解決しようとしているタイプを尋ねて、それに基づいて行動できるようにする方法はないと思います。したがって、タイプ固有の実装が必要な場合は、他の方法でタイプを知らせる必要があります。多くの場合(常にではありませんが)それで役に立ちます。