c# - 在 ASP.net 核心应用程序中使用 IMemoryCache 和 Unity DI 容器
问题描述
我想IMemoryCache
在我的 ASP.Net Core 应用程序中使用,但问题是我不知道如何在 Unity DI 容器中注册它,而不是默认的 DI 实现。
如果我会使用默认 DI,它会通过添加来解决问题
services.AddMemoryCache();
到startup.cs的行。
因此,我将不胜感激任何有助于我使用IMemoryCache
Unity DI 的想法,因为现在我收到以下错误:
InvalidOperationException:当前类型 Microsoft.Extensions.Caching.Memory.IMemoryCache 是一个接口,无法构造。您是否缺少类型映射?
启动时的 DI 部分:
public void Configure (IApplicationBuilder app, IStringLocalizer<Startup> stringLocalizer)
{
InitializeContext ();
....
private static void InitializeContext ()
{
var container = new UnityContainer ();
UnityConfigurationSection section
= (UnityConfigurationSection) ConfigurationManager.GetSection ("unity");
section.Configure (container, "primaryUnityContainer");
var resolver = new UnityDependencyResolver (container);
container.RegisterInstance<IDependencyResolver> (resolver);
DependencyContext.Initialize (resolver);
}
更新:
它是 Microsoft.Practices.Unity 命名空间中的旧版 Unity DI 容器,不能用作 .net 核心的默认 DI
解决方案
使用Unity.Microsoft.DependencyInjection
与Microsoft.Extensions.DependencyInjection兼容系统集成的 Unity 扩展
改变启动方式
public void ConfigureServices(IServiceCollection services) {
services.AddMemoryCache(); //<-- Adding memory cache
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_xxx);
//...
}
public void ConfigureContainer(IUnityContainer container) {
// Could be used to register more types
UnityConfigurationSection section
= (UnityConfigurationSection) ConfigurationManager.GetSection ("unity");
section.Configure (container, "primaryUnityContainer");
var resolver = new UnityDependencyResolver (container);
container.RegisterInstance<IDependencyResolver> (resolver);
DependencyContext.Initialize (resolver);
}
注意 DI 配置代码是如何移动到它们各自的方法中的
添加到服务集合中的所有ConfigureServices
内容都将由 Unity ServiceProviderFactory 填充到容器中
确保在构建主机时添加容器工厂以使用 Unity 作为默认 DI
在WebHostBuilder
添加UseUnityServiceProvider(...)
方法中
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUnityServiceProvider() // <---- Add this line
.UseStartup<Startup>()
.Build();
推荐阅读
- python - 执行 VPython 程序后 VS Code 集成终端冻结
- ruby-on-rails - 将 RoR 应用程序部署到 Heroku,出现“Ruby 解释器或扩展库中的错误”错误
- java - Docker JAVA 11 - 无法创建 Java 虚拟机。无效的 -Xlog 选项
- visual-studio - 项目中的 Microsoft.AspNetCore.Mvc 引用导致 Blazor WASM 问题
- python - 如何使用 matplotlib 绘制合成向量?
- java - Java REST Enum 序列化和 Spring
- python - ImportError : cannon import name 'path' | django
- mongodb - 为什么不使用点符号时 $match 不起作用
- azure - Azure 流量管理器 - API 管理服务已降级?
- command-line-interface - 如何在 Linux 上仅安装 ksqlDB CLI 工具?