依赖注入和缓存 类 最佳实践
Dependency injection and caching classes best practice
我有一个项目,我想在其中对多个接口使用缓存。
最好的方法是什么?我有两个想法:
缓存和非缓存class将实现相同的接口
public interface IFoo
{
object Get();
}
public class Foo : IFoo
{
public object Get()
{
// return something from datasource
return null;
}
}
public class FooCached : IFoo
{
private readonly IFoo fooService;
public FooCached(IFoo fooService)
{
this.fooService = fooService;
}
public object Get()
{
// check cache and if empty load the value using fooService (Foo class)
return this.fooService.Get();
}
}
每个实现都有自己的接口(虽然在这种情况下它基本上是相同的,只是名称不同)
public interface IFoo
{
object Get();
}
public interface IFooCached : IFoo
{
}
public class Foo : IFoo
{
public object Get()
{
// return something from datasource
return null;
}
}
public class FooCached : IFooCached
{
private readonly IFoo fooService;
public FooCached(IFoo fooService)
{
this.fooService = fooService;
}
public object Get()
{
// check cache and if empty load the value using fooService (Foo class)
return this.fooService.Get();
}
}
我个人比较喜欢第一种方式。我不太喜欢这种情况下的接口继承,因为这两个 class 基本上是相同的,只是实现略有不同,我觉得它们应该有相同的接口。
但是,由于没有 "easy" 我可以看到使用 Unity 实现此目的的方法,我不确定这是否真的是最好的方法。
基本上我需要将 IFoo 解析为 FooCached,除了 FooCached 本身,我需要 Foo。 (我知道如何完成这项工作,例如使用命名注册并为 FooCached 指定 InjectionConstructor,但这可能超出了这个问题的范围)。
另一方面,第二个非常容易设置。
第一种方法很常见,很容易与现代 DI 框架集成,例如SimpleInjector
(它有 RegisterDecorator
方法)。该模式称为 Decorator,非常方便,因为您的调用者 classes 无需担心数据来自何处以及如何获得,而是直接在 DI 容器中配置所有内容。我建议即使没有 DI 也使用相同的模式,它也遵循 open/closed 原则:这个 class 对修改关闭,但对扩展开放(通过链接装饰器)。
P.S。我不是 100% 确定如何使用 Unity 实现这一点,但您可以尝试在其中搜索装饰器模式实现。
我有一个项目,我想在其中对多个接口使用缓存。
最好的方法是什么?我有两个想法:
缓存和非缓存class将实现相同的接口
public interface IFoo { object Get(); } public class Foo : IFoo { public object Get() { // return something from datasource return null; } } public class FooCached : IFoo { private readonly IFoo fooService; public FooCached(IFoo fooService) { this.fooService = fooService; } public object Get() { // check cache and if empty load the value using fooService (Foo class) return this.fooService.Get(); } }
每个实现都有自己的接口(虽然在这种情况下它基本上是相同的,只是名称不同)
public interface IFoo { object Get(); } public interface IFooCached : IFoo { } public class Foo : IFoo { public object Get() { // return something from datasource return null; } } public class FooCached : IFooCached { private readonly IFoo fooService; public FooCached(IFoo fooService) { this.fooService = fooService; } public object Get() { // check cache and if empty load the value using fooService (Foo class) return this.fooService.Get(); } }
我个人比较喜欢第一种方式。我不太喜欢这种情况下的接口继承,因为这两个 class 基本上是相同的,只是实现略有不同,我觉得它们应该有相同的接口。
但是,由于没有 "easy" 我可以看到使用 Unity 实现此目的的方法,我不确定这是否真的是最好的方法。 基本上我需要将 IFoo 解析为 FooCached,除了 FooCached 本身,我需要 Foo。 (我知道如何完成这项工作,例如使用命名注册并为 FooCached 指定 InjectionConstructor,但这可能超出了这个问题的范围)。 另一方面,第二个非常容易设置。
第一种方法很常见,很容易与现代 DI 框架集成,例如SimpleInjector
(它有 RegisterDecorator
方法)。该模式称为 Decorator,非常方便,因为您的调用者 classes 无需担心数据来自何处以及如何获得,而是直接在 DI 容器中配置所有内容。我建议即使没有 DI 也使用相同的模式,它也遵循 open/closed 原则:这个 class 对修改关闭,但对扩展开放(通过链接装饰器)。
P.S。我不是 100% 确定如何使用 Unity 实现这一点,但您可以尝试在其中搜索装饰器模式实现。