- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 ASP.NET Core 2.x 应用程序,假设我正在使用两种分布式缓存机制:
services.AddDistributedSqlServerCache()
services.AddDistributedRedisCache()
据我了解,由于 Redis 是最后注册的,因此只要请求 IDistributedCache
实例,它就会解析为 RedisCache
实现。
在我的项目中,我还使用了 Distributed-Cache
标签助手,我想将其解析为 RedisCache
(没问题,适用于上述设置)。
不过,我也在使用 Session 中间件,它也需要一个 IDistributedCache
实现。
我需要 Session
中间件来解析 SQL 分布式缓存和 Distributed-Cache
标签助手以及对 IDistributedCache
的任何其他请求> 缓存以解析为 RedisCache
。
如果我明白this文章正确,您可以指定服务定位器解析到哪个实现以对 services.AddSingleton
进行通用调用,但这似乎并没有转换像 AddSession()
这样的中间件注册辅助函数>.
有什么解决办法吗?
最佳答案
AddDistributedSqlServerCache()
和 AddDistributedRedisCache()
都为 IDistributedCache
注册了一个单例:SqlServerCache
和 RedisCache
分别。由于依赖组件仅依赖于 IDistributedCache
,因此它们都将获得相同的分布式缓存实现(取决于最后注册的内容)。
这通常是设计使然,因为实现,例如 session 中间件,不应该关心 IDistributedCache
的实际注册实现是什么。这仅取决于是否存在一些并使用它。同样,其他服务也将只使用一个分布式缓存依赖项。
通常,没有办法解决这个问题。您最终可以做的是创建一些实现 IDistributedCache
本身的适配器,然后根据传递的参数委托(delegate)给 SQL Server 缓存或 Redis 缓存。
对于您的情况,有一种更简单的方法。由于 ASP.NET Core 的构建具有很强的可扩展性,并且大多数组件可以被其他实现简单地交换,我们可以在这里利用它来使 session 中间件只使用专门的分布式缓存,而其他一切都回退到默认缓存。
为此,我们只需实现 ISessionStore
并注册它,这基本上也是 AddSession()
所做的。在自定义 session 存储实现中,我们不依赖于 IDistributedCache
,而是直接依赖于 SqlServerCache
。这样一来,我们就不会回退到默认的 IDistributedCache
(无论那是什么),而是强制系统使用 SqlServerCache
。
public class SqlServerCacheSessionStore : ISessionStore
{
private readonly IDistributedCache _cache;
private readonly ILoggerFactory _loggerFactory;
public SqlServerCacheSessionStore(SqlServerCache cache, ILoggerFactory loggerFactory)
{
_cache = cache ?? throw new ArgumentNullException(nameof(cache));
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
public ISession Create(string sessionKey, TimeSpan idleTimeout, TimeSpan ioTimeout, Func<bool> tryEstablishSession, bool isNewSessionKey)
{
if (string.IsNullOrEmpty(sessionKey))
throw new ArgumentNullException(nameof(sessionKey));
if (tryEstablishSession == null)
throw new ArgumentNullException(nameof(tryEstablishSession));
return new DistributedSession(_cache, sessionKey, idleTimeout, ioTimeout, tryEstablishSession, _loggerFactory, isNewSessionKey);
}
}
这实际上与 DistributedSessionStore
的实现相同,它是默认的 ISessionStore
实现,只是我们依赖于 SqlServerCache
而不是 IDistributedCache
.
现在,我们只需要在 Configure
方法中连接所有内容:
// we keep the Redis cache as the default
services.AddDistributedRedisCache();
// no call to `AddSqlServerCache` as we don’t want to overwrite the `IDistributedCache`
// registration; instead, register (and configure) the SqlServerCache directly
services.AddSingleton<SqlServerCache>();
services.Configure<SqlServerCacheOptions>(options =>
{
// here goes the configuration that would normally be done in the
// configure action passed to `AddSqlServerCache`
options.ConnectionString = Configuration.GetConnectionString("DistributedCache");
});
// add session, but overwrite the `ISessionStore` afterwards
services.AddSession();
services.AddTransient<ISessionStore, SqlServerCacheSessionStore>();
这应该就是全部了。因此,当 session 中间件现在解析 ISessionStore
时,它将获得 SqlServerCacheSessionStore
,它直接依赖于 SqlServerCache
而不是一般的 IDistributedCache
这将是 Redis 缓存。
关于c# - ASP.NET Core 2.x 中间件的自定义依赖注入(inject)解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52067152/
我已阅读有关依赖注入(inject)的信息。然后来了 构造函数注入(inject), setter/getter 注入(inject) 二传手注入(inject) 接口(interface)注入(in
我正在研究依赖注入(inject)模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepositor
我开始使用 Google Guice。 我有一个简单的问题: javax.inject 的 @Inject 注释和 com.google.inject 的 有什么区别@Inject 一个 ? 谢谢。
当使用构造函数注入(inject)工厂方法时,依赖的属性不会得到解析。但是,如果在解析依赖的组件之前解析了工厂方法,则一切都会按预期工作。此外,当仅使用属性注入(inject)或构造函数注入(inje
我有这样的事情: class Root { public Root(IDependency dep) {} } class Dependency:IDependency { p
听完Clean Code Talks ,我开始明白我们应该使用工厂来组合对象。因此,例如,如果 House有一个 Door和 Door有一个 DoorKnob , 在 HouseFactory我们创建
情况:我需要在一些 FooClass 中进行惰性依赖实例化,所以我通过 Injector类作为构造函数参数。 private final Injector m_injector; public Foo
在编写代码时,我们应该能够识别两大类对象: 注入(inject)剂 新品 http://www.loosecouplings.com/2011/01/how-to-write-testable-cod
这个问题是关于 Unity Container 的,但我想它适用于任何依赖容器。 我有两个具有循环依赖关系的类: class FirstClass { [Dependency] pub
如果我有 10 个依赖项我需要注入(inject)并且不想在构造函数中有 10 个参数,我应该使用哪种注入(inject)模式? public class SomeClass { privat
我在使用 Angular2 DI 时遇到了问题。我尝试将一个类注入(inject)另一个类,它引发了以下错误: 留言:"Cannot resolve all parameters for 'Produ
对依赖注入(inject)还很陌生,我想弄清楚这是否是一种反模式。 假设我有 3 个程序集: Foo.Shared - this has all the interfaces Foo.Users -
我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。 我正在尝试创建一些静态函数来使用包 ng
希望这个问题不是太愚蠢,我试图掌握更高级的编程原理,因此试图习惯使用 Ninject 进行依赖注入(inject)。 因此,我的模型分为几个不同的 .dll 项目。一个项目定义了模型规范(接口(int
我最近一直在大量使用依赖注入(inject)、测试驱动开发和单元测试,并且开始喜欢上它。 我在类中使用构造函数依赖,这样我就可以为单元测试注入(inject)模拟依赖。 但是,当您实际需要生产环境中的
我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject。这两种方式有什么区别吗? Guice官网似乎推荐
这个问题在这里已经有了答案: Angular2 Beta dependency injection (3 个答案) 关闭 7 年前。 我正在使用 angular2 测试版。并在使用 @Inject
有没有可能做这样的事情? (因为我尝试过,但没有成功): @Injectable() class A { constructor(private http: Http){ // <-- Injec
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有这个: SomePage.razor: @inject Something something @page "/somepage" My Page @code { // Using
我是一名优秀的程序员,十分优秀!