我想将存储库包装在另一个存储库中,该存储库将在内部使用传入的存储库时处理缓存。 这样,我的缓存逻辑可以与存储库实现完全分离。这种模式还允许我轻松地从内存缓存更改为分布式缓存,也就是说,我可以拥有使用不同缓存类型的不同缓存存储库,因此我可以根据环境将其插入。在Azure上,我可以使用分布式缓存,但在单个服务器上,我可以使用内存缓存。
$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$ARCH-pc-windows-gnu"
显然,当CachingFooRepository实现IFooRepository时,我必须确保将不同的IFooRepository实现传递给CachingFooRepository的构造函数,因为它不是IFooRepository的真正实现,而是依赖于实际的实现。
这个例子是简化的伪代码,是否要缓存以及缓存多长时间可以作为IFooCachingRules或IOptions等传入。
所以我的问题是如何以这样的方式重新设置服务:依赖于IFooRepository的东西将获得CachingFooRepository的实例,但是CachingFooRepository将获得一些其他的IFooRepository实现,例如SqlFooRepository? 我想保留其他类只依赖于IFooRepository,我不想特别依赖CachingFooRepository。
这是可行的,可行的,好主意,一个坏主意吗?
答案 0 :(得分:4)
我想将存储库包装在另一个存储库中 使用传入的存储库在内部处理缓存。
您正在使用的模式有一个名称。它被称为:Decorator pattern。
一个好主意,一个坏主意?
使用装饰器模式是一个很好的主意,因为它允许您进行添加功能,而无需对系统的任何现有部分进行更改。换句话说,您可以遵守Open/closed principle。
这可能吗
不,ASP.NET内核的DI容器有no easy way do this。您应该使用.NET的成熟现有DI库之一来执行此操作。对应用装饰器模式提供最佳支持的三个库是Autofac,StructureMap和Simple Injector。
答案 1 :(得分:0)