因此,假设我有一个接口(interface)IThingFactory
:
public interface IThingFactory
{
Thing GetThing(int thingId);
}
现在,假设我有一个具体的实现,可以从数据库中检索
Thing
。现在,让我们说一个具体的实现,它包装了一个现有的IThingFactory
,并在命中被包装的Thing
之前在内存中的缓存中检查了IThingFactory
的存在。就像是:public class CachedThingFactory : IThingFactory
{
private IThingFactory _wrapped;
private Dictionary<int, Thing> _cachedThings;
public CachedThingFactory(IThingFactory wrapped)
{
this._wrapped = wrapped;
_cachedThings = new Dictionary<int,Thing>();
}
public Thing GetThing(int thingId)
{
Thing x;
if(_cachedThings.TryGetValue(thingId, out x))
return x;
x = _wrapped.GetThing(thingId);
_cachedThings[thingId] = x;
return x;
}
}
我该如何使用依赖注入(inject)(例如Ninject)来处理这种情况,以便配置DI容器,以便可以注入(inject)或删除这样的缓存代理,或者执行日志记录,或(在此处插入)?
最佳答案
您可以按照以下方式进行操作:
Bind<IThingFactory> ().To<DefaultThingFactory> ().WhenInjectedInto<CachedThingFactory> ();
Bind<IThingFactory> ().To<CachedThingFactory> ();
这将使消费者不需要指定名称属性,并且仍然相对容易进一步增强。如果以后您想添加一个额外的“装饰器”层来进行日志记录,则可以执行以下操作:
Bind<IThingFactory> ().To<DefaultThingFactory> ().WhenInjectedInto<LoggingThingFactory> ();
Bind<IThingFactory> ().To<LoggingThingFactory> ().WhenInjectedInto<CachedThingFactory> ();
Bind<IThingFactory> ().To<CachedThingFactory> ();
不是最漂亮的,但它可以工作。