Castle Windsor拦截器解决缓存方面的问题

本文关键字:缓存 方面 问题 解决 Windsor Castle | 更新日期: 2023-09-27 18:30:10

我最近决定使用castle中的拦截器功能来实现缓存。它运行良好。

我的问题是:如果我想避开某个特定呼叫的拦截器,你建议使用什么策略?

我已经确定,对于给定的服务,我可以有两个实现——一个支持缓存方面,另一个不支持。然后我可以从任何地方打电话给合适的人。我不喜欢这样,原因有很多。

在我知道缓存会无效的时候,我可以让它无效,但按照这种思路,我无法想出一个好的解决方案,仍然将缓存问题排除在我的代码之外。

Castle Windsor拦截器解决缓存方面的问题

我通常使用decorator来缓存关注点。

关于删除/无效缓存项,我提出了一个基于事件的解决方案:
真正的服务公开那些改变系统的行为的事件(例如添加或更新项目),装饰器服务(缓存策略)将其自身注册到这些事件中以管理缓存。

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

如果你对这个代码气味不满意,你可以:

将您的组件注册为具有或不具有缓存的命名组件。然后您可以选择性地使用那些命名的组件。

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与IServiceWithCache。

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

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