因此,假设我有一个接口(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> ();

不是最漂亮的,但它可以工作。

09-25 19:20