首页 > 解决方案 > 在 ASP.net 核心应用程序中使用 IMemoryCache 和 Unity DI 容器

问题描述

我想IMemoryCache在我的 ASP.Net Core 应用程序中使用,但问题是我不知道如何在 Unity DI 容器中注册它,而不是默认的 DI 实现。

如果我会使用默认 DI,它会通过添加来解决问题

services.AddMemoryCache();

startup.cs的行。

因此,我将不胜感激任何有助于我使用IMemoryCacheUnity 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

标签: c#asp.net-corecachingdependency-injectionunity-container

解决方案


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

推荐阅读