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