【问题标题】:Asp.net core, basic problems i dont understandAsp.net core,我不明白的基本问题
【发布时间】:2017-02-14 02:01:17
【问题描述】:

第一个问题:

services.AddMemoryCache();  // in Startup config
public class AController
{
public AController(IMemoryCache cacheA) { }
}

public class BController
{
public BController(IMemoryCache cacheB) { }
}

问题是cacheA和cacheB一样

我想要私有 API(集群连接)和公共 API(暴露给前端) 如何在保持所有 DI 模式友好的同时将它们分开?

第二个问题;

我想要一个通过 HTTP 请求一些外部网络服务器的服务 其结果将缓存在该服务中,也存储在数据库中 所以我们先查询localCache,再查询DB,再查询外部服务器

该服务的结果将在控制器中使用并发送到前端

如何用所有花哨的 asp.netcore 模式来实现这样的事情? 缓存必须是 ONE(singleton) 所以我们不会浪费数据库请求

?将此类服务添加为 services.SCOPED 但是如何使其缓存对于每个实例(一些单例 DI?或静态 MemoryCache 实例?) 我不知道,不知道请求帮助

在 node.js 中,我会在几分钟内完成所有操作,但它是微软,嘿

【问题讨论】:

  • 一看源代码就可以回答你所有的问题:github.com/aspnet/Caching/blob/…
  • 大声笑,这是一个很好的功能,如果 VS (Peek Definition - Alt F12) 可以准确地显示源代码,那将是一个很好的功能

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


【解决方案1】:

定义两个缓存接口:

public interface IPrivateMemoryCache: IMemoryCache
{
}

public interface IPublicMemoryCache: IMemoryCache
{
}

public class AController
{
    public AController(IPrivateMemoryCache cacheA) { }
}

public class BController
{
    public BController(IPublicMemoryCache cacheB) { }
}

现在您可以为您的 IoC 容器定义不同的实例化规则。

【讨论】:

  • 只有在两个接口都定义了不同的合约时才有意义,或者换句话说,当有一个IMemoryCache 接口会违反Liskov Substitution Principle 时,这样做才有意义。
  • 不要以为你完全得到了 LSP。它不仅与数据成员的数据类型和名称有关,还与 行为 子类型有关(例如,它解释了 marker interfaces 的使用,所有这些都具有相同的成员)。如果设计需要独立的私有和公共缓存,它们在逻辑上是不同的。
  • 我想我理解 LSP 就好了:) 是的,你是对的,这完全是关于行为的。这里的问题是,从消费者的角度来看,这些实现的行为是否不同。
  • 这听起来像是要求在私有缓存中创建的项目不会影响公共缓存的存储空间,反之亦然,所以是的,需要一个不同的行为。我想这两个缓存的大小和寿命也可以独立配置。 OTOH,你能想到使用两个接口的替代方法吗?
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2021-10-17
  • 2021-04-26
  • 2020-02-13
  • 2021-11-10
相关资源
最近更新 更多