Castle Windsor Interceptor解决缓存问题

时间:2013-09-05 02:03:06

标签: c# castle-windsor castle-dynamicproxy

我最近决定使用来自castle的拦截器功能来实现缓存。它工作正常。

我的问题:如果我想避开特定通话的拦截器,你会建议使用什么策略?

我已经确定我可以有两个支持缓存方面的给定服务实现,而不支持缓存方面。然后我可以从任何地方拨打适当的电话。我不喜欢这个原因很多。

我可以在我知道它无效的时候使缓存失效,但是我无法想出一个好的解决方案,这种思路仍然会让我的代码缓存出来。

2 个答案:

答案 0 :(得分:2)

我通常使用装饰器来缓存问题。

关于删除/使缓存项无效我发布了一个解决方案事件:
真实服务为那些改变系统的行为公开事件(为了添加或更新项目),装饰服务(缓存策略)将它自己注册到那些事件来管理缓存。

答案 1 :(得分:0)

我在城堡传感器拦截器的帮助下使用了缓存,我遇到了同样的问题。 通常,服务不应该知道依赖项是否启用了高速缓存。 这将违反单一责任原则。

如果您对此代码气味不满意,您可以:

使用和不使用缓存将组件注册为命名组件。 然后,您可以有选择地使用这些命名组件。

var container = new WindsorContainer();
container.Register(Component.For<CachingInterceptor>()
.Instance(new CachingInterceptor(new Cache(TimeoutStyle.RenewTimoutOnQuery, TimeSpan.FromSeconds(3)))));

container.Register(Component.For<IRepo>().ImplementedBy<Repo>().Named("Without"));
container.Register(Component.For<IRepo>().ImplementedBy<Repo>().Interceptors<CachingInterceptor>().Named("With"));
container.Register(Component.For<Service>());
container.Register(Component.For<Game>().DependsOn(Property.ForKey<IRepo>().Is("With")));

var service = container.Resolve<Service>();
var game = container.Resolve<Game>();

Console.WriteLine("Cache is not used");
service.Invoke();
service.Invoke();

Console.WriteLine();
Console.WriteLine("Cache is used");
game.Invoke();
game.Invoke();

我在github上有这个项目: https://github.com/kobbikobb/Caching

如果你对这个代码味道没问题,你可以:

1。 我使用不同的接口取决于我想要何时使用缓存。 IService vs IServiceWithCache。

2。 实现单独的thead安全“缓存启用”服务以启用/禁用缓存。 如果你想模拟这个服务,你可以通过环境上下文实现它。

CacheSettings.Disable();
try
{
    ...
}
finally
{
    CacheSettings.Enable();
}