Метод не найден: ‘Void SimpleInjector.ScopedLifestyle..ctor(System.Строка, логическое значение)’

#c# #asp.net-mvc #visual-studio-2017 #simple-injector #webapi

#c# #asp.net-mvc #visual-studio-2017 #простой инжектор #webapi

Вопрос:

я пытаюсь использовать простой инжектор внутри моего проекта web api, после этого я получил эту ошибку

введите описание изображения здесь

вот мой файл SimpleInjectorInitializer.cs :

 [assembly: WebActivator.PostApplicationStartMethod(typeof(Argo.WebApi.App_Start.SimpleInjectorWebApiInitializer), "Initialize")]

namespace Argo.WebApi.App_Start
{
    using System.Web.Http;
    using Argo.Core.Cache.Elasticsearch;
    using Argo.DataRepository.Cache.Interface;
    using Argo.Web.Api;
    using SimpleInjector;
    using SimpleInjector.Integration.WebApi;
    using SimpleInjector.Lifestyles;
    
    public static class SimpleInjectorWebApiInitializer
    {
        /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
        public static void Initialize()
        {
            var container = new Container();
            container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
            
            InitializeContainer(container);

            container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
       
            container.Verify();
            
            GlobalConfiguration.Configuration.DependencyResolver =
                new SimpleInjectorWebApiDependencyResolver(container);
        }
     
        private static void InitializeContainer(Container container)
        {
//#error Register your services here (remove this line).

            // For instance:
            container.Register<IElasticOccurrenceCache, ElasticOccurrenceCache>(Lifestyle.Scoped);
            container.Register<IBigNumbersService, BigNumbersService>(Lifestyle.Scoped);
        }
    }
}
  

этот файл был сгенерирован автоматически после установки пакета simple injector

 // that is the only code i add in this file 
            container.Register<IElasticOccurrenceCache, ElasticOccurrenceCache>(Lifestyle.Scoped);
            container.Register<IBigNumbersService, BigNumbersService>(Lifestyle.Scoped);
  

я надеюсь, что это вся информация, которая вам нужна, вам нужна дополнительная информация, которую вы можете задать мне в комментарии, и я ее предоставлю

Спасибо за помощь

Ответ №1:

Вы можете решить это из трассировки стека:

WebRequestLifestyle Класс SimpleInjector (живет в SimpleInjector.Integration.Web.dll ) обновляется, и его ctor делегирует ctor своего базового класса ScopedLifestyle (живущего в SimpleInjector.dll ), в котором, как он ожидает, будет показана подпись.

Но когда среда выполнения загружает ScopedLifestyle тип из отдельной сборки, она не находит того, что ожидает там быть — ни одна из доступных подписей ctor не верна, ни одна из них не соответствует тому, что SimpleInjector .Integration.Web.dll сказал, что должен быть там.

Единственные два объяснения:

  1. команда SimpleInjector допустила ужасную ошибку в своих сборках
  2. или у вас несоответствующие версии SimpleInjector .dll и SimpleInjector.Integration.Web.dll

Лучший способ решить эту проблему — удалить все ваши папки obj, bin и package (не полагайтесь на «чистую» функциональность VS), убедитесь, что все ваши ссылки на пакеты указывают на пакеты, которые должны работать вместе, затем запустите nuget restore .

На самом деле я бы рекомендовал удалить SimpleInjector и SimpleInjector .Интеграция.Веб полностью, затем только переустановка второго — это должно автоматически установить соответствующую версию базового пакета.

(подробнее о классах см. Здесь: https://simpleinjector.org/ReferenceLibrary/html/T_SimpleInjector_Integration_Web_WebRequestLifestyle.htm — не полезно для решения, но помогло мне в ответе)

Комментарии:

1. Я могу гарантировать, что вариант 1) не является причиной. Скорее всего, OP использует версию веб-пакета версии 4.x, при этом используется версия 5.x основной библиотеки.

2. В противном случае я совершил ужасную ошибку 😉