Castle Windsor拦截器解决缓存方面的问题
本文关键字:缓存 方面 问题 解决 Windsor Castle | 更新日期: 2023-09-27 18:30:10
我最近决定使用castle中的拦截器功能来实现缓存。它运行良好。
我的问题是:如果我想避开某个特定呼叫的拦截器,你建议使用什么策略?
我已经确定,对于给定的服务,我可以有两个实现——一个支持缓存方面,另一个不支持。然后我可以从任何地方打电话给合适的人。我不喜欢这样,原因有很多。
在我知道缓存会无效的时候,我可以让它无效,但按照这种思路,我无法想出一个好的解决方案,仍然将缓存问题排除在我的代码之外。
我通常使用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();
}