在这种情况下,简单地使用 TinyIoC 的开放泛型功能可能就足够了。
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 询问它当前尝试解析的类型然后能够对其采取行动,因此如果您需要特定于类型的实现,则必须通过其他方式知道类型 - 和泛型通常(并非总是)对此有所帮助。