如何在ASP.NET 5 DI中配置嵌套依赖?

时间:2015-07-18 16:02:05

标签: c# caching dependency-injection asp.net-core

我想将存储库包装在另一个存储库中,该存储库将在内部使用传入的存储库时处理缓存。 这样,我的缓存逻辑可以与存储库实现完全分离。这种模式还允许我轻松地从内存缓存更改为分布式缓存,也就是说,我可以拥有使用不同缓存类型的不同缓存存储库,因此我可以根据环境将其插入。在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。

这是可行的,可行的,好主意,一个坏主意吗?

2 个答案:

答案 0 :(得分:4)

  

我想将存储库包装在另一个存储库中   使用传入的存储库在内部处理缓存。

您正在使用的模式有一个名称。它被称为:Decorator pattern

  

一个好主意,一个坏主意?

使用装饰器模式是一个很好的主意,因为它允许您进行添加功能,而无需对系统的任何现有部分进行更改。换句话说,您可以遵守Open/closed principle

  

这可能吗

不,ASP.NET内核的DI容器有no easy way do this。您应该使用.NET的成熟现有DI库之一来执行此操作。对应用装饰器模式提供最佳支持的三个库是AutofacStructureMapSimple Injector

答案 1 :(得分:0)

与流行的看法相反,装饰器模式fairly easy,可使用内置容器来实现。

通过在链接的答案中使用扩展方法,注册装饰器变得如此简单:

B.Color
相关问题