我有类似的代码:
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));
编辑:标记为重复吗?另一个问题包含答案,该答案将配置参数转换为新的依赖项...因此它无法回答我的问题。
答案 0 :(得分:1)
问题主要是您需要将值类型注入到装饰器的构造函数中。为了解决这个问题,您需要使用工厂方法来创建服务,例如:
container.Register<IMyInterface>(() =>
{
var decorated = container.GetInstance<MyClass>();
return new MyCachedClass(decorated, TimeSpan.FromMinutes(60));
});
为了获得装饰的类,可以使用容器来解决依赖关系。但是,您不能使用IMyInterface
来解析修饰的服务,因为这会导致循环。尽管使用接口会更好,但是如果要使用MyClass
以外的类型,则仍然只是代码中的一处需要更改。