【问题标题】:Use IMemoryCache with Unity DI Container in ASP.net core application在 ASP.net 核心应用程序中使用 IMemoryCache 和 Unity DI 容器
【发布时间】:2020-01-21 18:27:34
【问题描述】:

我想在我的 ASP.Net Core 应用程序中使用 IMemoryCache,但问题是我不知道如何在 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 core 的默认 DI

【问题讨论】:

  • 您是否对容器使用任何集成?检查github.com/unitycontainer/microsoft-dependency-injection
  • IDependencyResolver 不是 asp.net-core 的一部分。你的项目是什么版本?
  • @Nkosi Unity DI 实现必须像这样,因为我正在使用的遗留组件需要它
  • @Nkosi 核心 2.1

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


【解决方案1】:

使用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();

【讨论】:

  • 我在使用 Unity.Microsoft.DependencyInjection 时遇到问题,因为我的旧功能来自 Microsoft.Practices.Unity 命名空间。仍然无法让 Unity 作为完整的 DI 容器工作
  • @mk_yo 更新原始问题,了解此遗留功能如何影响与 .net 核心的集成。因为您似乎正在尝试混合可能导致冲突的版本。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多