假设我有一个服务接口:
public interface IFooService
{
void DoSomething();
}
该服务的具体实现是通用的:
public class FooService<TRequestingClass> : IFooService
{
public virtual void DoSomething() { }
}
我还有其他一些需要 IFooService 实例的类:
public class Bar
{
private IFooService _fooService;
public Bar(IFooService fooService)
{
this._fooService = fooService;
}
}
我需要连接我的 IoC 容器,这样当 Bar 被创建时,它会传递一个 FooService<Bar> 的构造函数参数。还有很多其他的类,就像 Bar 一样。每个可能还需要传递给他们的 FooService<TRequestingClass> 实例,其中 TRequestingClass 是需要 IFooService 实例的类的类型。我不需要将这种古怪暴露给 IFooService 的消费者。他们应该关心的是他们可以调用他们传递的 IFooService 的方法。他们不需要知道传递给他们的 IFooService 的具体实现需要构造任何特殊的东西。
FooService<T> 的可接受替代方案是非泛型类,其构造函数中包含字符串参数,其中包含为其创建的类的名称。IE:
public class FooService : IFooService
{
public FooService(string requestingClassName) { }
}
如何连接我的 IoC 容器以这种方式构建依赖项?
如果您对我为什么想要这样一个奇怪的结构感到困惑,请考虑一下当您获得使用 log4net.LogManager.GetLogger(typeof(SomeClass)) 创建的 ILog 时 log4net 的最佳工作方式。我不想在我的代码中乱扔对 log4net 的引用,所以我想编写一个简单的 ILogger 接口,并用这样的东西来实现它:
public class GenericLogger<T> : ILogger
{
private readonly ILog log;
public GenericLogger()
{
this.log = log4net.LogManager.GetLogger(typeof(T));
}
public void Debug(object message)
{
this.log.Debug(message);
}
/* .... etc .... */
}