Используйте IMemoryCache с Unity DI Container в основном приложении ASP.net - PullRequest
1 голос
/ 20 сентября 2019

Я хочу использовать IMemoryCache в своем приложении ASP.Net Core, но проблема в том, что я не знаю, как зарегистрировать это в контейнере Unity DI, который используется вместо реализации DI по умолчанию.

Если бы я использовал DI по умолчанию, он работает, добавив

services.AddMemoryCache();

Line в 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);

}

ОБНОВЛЕНИЕ:

Это устаревший контейнер DI Unity от Microsoft.Practices.Unityпространство имен, которое нельзя использовать в качестве DI по умолчанию для ядра .net

1 Ответ

0 голосов
/ 20 сентября 2019

Использование Unity.Microsoft.DependencyInjection

Расширение Unity для интеграции с Microsoft.Extensions.DependencyInjection совместимых систем

изменение подхода Запуск

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 add UseUnityServiceProvider(...) метод

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
           .UseUnityServiceProvider()   // <---- Add this line
           .UseStartup<Startup>()
           .Build();
...