注册装饰器,该装饰器在构造函数中具有附加值参数

时间:2019-02-05 13:44:39

标签: c# simple-injector

我有类似的代码:

public interface IMyInterface
{
    int GetData();
}


public sealed class MyClass : IMyInterface
{
    public int GetData() => ...
}


public sealed class MyCachedClass : IMyInterface
{
    public MyCachedClass(IMyInterface myInterface, TimeSpan cacheDuration)
    { ... }

    public int GetData()
    {
        int? data = GetDataFromCache();

        if (data == null)
        {
             data = myInterface.GetData();
             UpdateCache(data);
        }

        return data.Value
    }
}

现在我可以简单地使用以下方法注册MyClass:

container.Register<IMyInterface, MyClass>(Lifestyle.Singleton);

然后我要向每个IMyInterface实例添加装饰器。

container.RegisterDecorator<IMyInterface, MyCachedClass>(...);

不幸的是,由于构造函数中的TimeSpan cacheDuration参数,它无法工作。我找不到任何过载。

有没有类似这样的方法?

container.RegisterDecorator<IMyInterface>
    (instance => new MyCachedClass(instance, TimeSpan.FromMinutes(5));

编辑:标记为重复吗?另一个问题包含答案,该答案将配置参数转换为新的依赖项...因此它无法回答我的问题。

1 个答案:

答案 0 :(得分:1)

问题主要是您需要将值类型注入到装饰器的构造函数中。为了解决这个问题,您需要使用工厂方法来创建服务,例如:

container.Register<IMyInterface>(() =>
{
    var decorated = container.GetInstance<MyClass>();
    return new MyCachedClass(decorated, TimeSpan.FromMinutes(60));
});

为了获得装饰的类,可以使用容器来解决依赖关系。但是,您不能使用IMyInterface来解析修饰的服务,因为这会导致循环。尽管使用接口会更好,但是如果要使用MyClass以外的类型,则仍然只是代码中的一处需要更改。