#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 сказал, что должен быть там.
Единственные два объяснения:
- команда SimpleInjector допустила ужасную ошибку в своих сборках
- или у вас несоответствующие версии 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. В противном случае я совершил ужасную ошибку 😉