Преобразование V2 Ninject Binding в V3
Я уже 8 часов бьюсь головой об этом, и мне просто не удается найти простое объяснение того, как изменить мой пользовательский загрузчик для ninject (последний работал над кодом в v2.xxx) на новый синтаксис v3.0.0.0.
В настоящее время у меня есть следующее:
public class NinjectCustomBootStrapper : NinjectNancyBootstrapper
{
protected override Ninject.IKernel GetApplicationContainer()
{
return Program.MyContainer;
}
}
в отдельном классе, и:
public static IKernel MyContainer
{
get { return _myContainer ?? (_myContainer = CreateKernel()); }
set { _myContainer = value; }
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<CardMonitorService>().ToSelf().InSingletonScope();
return kernel;
}
в моей основной программе Program.c в приложении командной строки.
С тех пор я обновил ninject до V3.0.0.0 только для того, чтобы обнаружить, что произошли серьезные изменения. Я признаю, что я не использую ninject очень часто (я обычно использую Structuremap), и единственная причина, по которой этот проект делает, - я не писал его изначально.
Поскольку я обновил Ninject, теперь, когда приложение запускается, я получаю следующее исключение:
Method not found: 'Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax`1<!0>
Ninject.Syntax.IBindingToSyntax`1.ToConstant(!0)'.
После множества поисков и исследований самое близкое, что мне удалось найти, это:
http://sharpfellows.com/post/Ninject-Auto-registration-is-changing-in-version-3.aspx
Что, хотя и направляет меня в правильном направлении, все еще не совсем решение, так как я не использую собственный генератор привязок.
Итак, мой вопрос заключается в следующем.
Как переписать вышеупомянутое, чтобы мой проект снова работал и служба WCF при вызове получала правильную одноэлементную привязку, передаваемую ему при поступлении запроса. Возвращение к ninject 2 не вариант, так как другие зависимости в проекте, которые были добавлены принудительные обновления v3, и они добавляют новую функциональность, которая была запрошена, поэтому я и работаю над этим.
Для справки: это сборка.NET4, работающая на NancyFX с самостоятельной настройкой WCF в качестве службы Windows, использующей Topshelf для предоставления интерфейса SCM.
ура
Shawty
Приложение, чтобы немного прояснить ситуацию
Это существующий проект, который был написан некоторое время назад, меня попросили добавить некоторые новые функции в проект.
В рамках добавления этих новых функций мне потребовалось обновить используемую версию Ninject с более ранней версии до V3.0.0.0, поскольку более новые зависимости, добавленные в проект, требуют более новой версии Ninject.
В предыдущем V2 Ninject приведенный выше код работал нормально, без проблем, поскольку в проект был добавлен Ninject V3, и теперь я получаю исключение, как описано выше.
Я не могу вернуться к более ранней версии Ninject, так как это будет означать невозможность добавить новую функциональность, которую я добавляю.
Из исследования, которое я провел до сих пор, ссылка на sharpfellows, приведенная выше, является наиболее близким объяснением моей проблемы, которую мне удалось найти до сих пор в Интернете.
Я не часто использую Ninject, поэтому у меня нет опыта, чтобы понять, что изменилось между V2 и V3, что (на основании моих исследований) является причиной моей проблемы.
Мне нужно знать, как изменить мой код, написанный под V2 (и показанный выше), чтобы он работал под V3.
2 ответа
Поэтому примерно через неделю выясняется, что проблема заключалась в том, что команда разработчиков Nancy нарушила двоичную сопоставимость с последней версией ninject (или наоборот):-)
Существует GitHub pull-запрос, чтобы исправить это, доступный по адресу:
https://github.com/NancyFx/Nancy.Bootstrappers.Ninject/pull/6
Однако следующая версия 'Nancy.Bootstrapper.Ninject' 0.12 скоро выйдет на NuGet, в которой будет реализовано исправление.
MissingMethodException
обычно это проблема развертывания. Вы компилируете против другой сборки, чем вы используете. Убедитесь, что вы развернули ту же версию и ту же сборку.