nancy selfhost, с dryioc и загрузчиком -> Метод не найден, исключение

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

Я начал с консольного приложения, используя topshelf для размещения nancy через пакет nancy selfhosting. Все это работает.

Теперь я хотел подключить контейнер DryIoc к загрузчику nancy и получил следующую ошибку:

System.MissingMethodException
  HResult=0x80131513
  Message=Method not found: 'DryIoc.Rules DryIoc.Rules.With(DryIoc.FactoryMethodSelector, DryIoc.ParameterSelector, DryIoc.PropertiesAndFieldsSelector, Boolean)'.
  Source=Nancy.Bootstrappers.DryIoc
  StackTrace:
   at Nancy.Bootstrappers.DryIoc.DryIocNancyBootstrapper.<GetApplicationContainer>b__0(Rules rules)
   at DryIoc.Container..ctor(Func`2 configure, IScopeContext scopeContext)
   at Nancy.Bootstrappers.DryIoc.DryIocNancyBootstrapper.GetApplicationContainer()
   at Nancy.Bootstrapper.NancyBootstrapperBase`1.Initialise()
   at Nancy.Hosting.Self.NancyHost..ctor(INancyBootstrapper bootstrapper, HostConfiguration configuration, Uri[] baseUris)
   at Nancy.Hosting.Self.NancyHost..ctor(Uri baseUri, INancyBootstrapper bootstrapper, HostConfiguration configuration)
   at Segrey.Licensing.Web.WebService.Start() in I:\git projects\Segrey.Licensing\Segrey.Licensing.Web\WebService.cs:line 21
   at Segrey.Licensing.Service.Program.<>c.<CreateHost>b__1_2(WebService ls) in I:\git projects\Segrey.Licensing\Segrey.Licensing.Service\Program.cs:line 26
   at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()

Мой загрузчик: пустой, пока нет регистраций, так как я сначала хотел проверить это, прежде чем усложнять

public class Bootstrapper : DryIocNancyBootstrapper
{
    protected override void ApplicationStartup(IContainer container, IPipelines pipelines)
    {
        //No registrations should be performed in here, however you may
        //resolve things that are needed during application startup.
        base.ApplicationStartup(container, pipelines);
    }

    protected override void ConfigureApplicationContainer(IContainer container)
    {
        //Perform registation that should have an application lifetime
        base.ConfigureApplicationContainer(container);
    }

    protected override void ConfigureRequestContainer(IContainer container, NancyContext context)
    {
        //Perform registrations that should have a request lifetime
        base.ConfigureRequestContainer(container, context);
    }

    protected override void RequestStartup(IContainer container, IPipelines pipelines, NancyContext context)
    {
        // No registrations should be performed in here, however you may
        // resolve things that are needed during request startup.
        base.RequestStartup(container, pipelines, context);
    }
}

И в моем методе .Start для службы через верхнюю полку, где назначается загрузчик

public void Start()
{
    var hostConfig = new HostConfiguration() { UrlReservations = new 
    UrlReservations { CreateAutomatically = true } };
    var uri = new Uri(_hostUrl);
    _nancyHost = new NancyHost(uri, new Bootstrapper(), hostConfig);
    _nancyHost.Start();
}

Ошибка возникает на новом NancyHost(uri, new Bootstrapper(), hostConfig); как только я добавлю новый Bootstrapper() в аргументы


person Hairydruidy    schedule 04.01.2018    source источник
comment
Похоже на проблему с версией. Проверьте свой файл .config на предмет привязки перенаправлений для dryioc. DryIocNancyBootstrapper считает, что использует версию X dryioc, но вместо этого использует версию Y (из-за перенаправления привязки), в которой нет этого метода (либо он был удален, либо это более старая версия, в которой его еще нет). Выясните, какая версия требуется DryIocNancyBootstrapper, и укажите ссылку на эту версию.   -  person    schedule 04.01.2018
comment
Поскольку Nancy.Bootstrapper.DryIoc требовал DryIoc.dll (›=2.7.0), я установил последний пакет dryIoc. Но действительно. Я пробовал откатиться до 2.10 (с 2.12). Но теперь, когда вы упомянули об этом, я действительно понизил версию до 2.7, и она работает. Не додумался бы и дальше снижать рейтинг, такая глупая ошибка. Большое тебе спасибо. Если вы могли бы предоставить это как ответ, я отмечу это как решение.   -  person Hairydruidy    schedule 04.01.2018
comment
Методы удаления Naughty DryIoc в более поздних версиях. В настоящее время переадресация привязки становится все более распространенной, поэтому такие критические изменения (к сожалению) слишком распространены.   -  person    schedule 04.01.2018


Ответы (1)


Похоже на проблему с версией. Проверьте свой файл .config на предмет привязки перенаправлений для dryioc.

Похоже, что DryIocNancyBootstrapper думает, что использует версию X DryIOC, но вместо этого использует версию Y (из-за перенаправления привязки), в которой нет этого метода (либо он был удален, либо это более старая версия, в которой его еще нет) .

Выясните, какую версию хочет DryIocNancyBootstrapper (т. е. версию X в приведенном выше примере), и укажите ссылку на эту версию.

person Community    schedule 04.01.2018
comment
В случае, если кто-то еще наткнется на это. Пока я принял это как ответ. После этого я связался с владельцем репозитория DryIoc. Он предложил попробовать обновить пакет DryIoc внутри DryIocNancyBootstrapper. У меня еще не было времени протестировать - person Hairydruidy; 06.01.2018
comment
Он абсолютно прав. Вот почему ответ Figure out what version DryIocNancyBootstrapper wants (i.e., version X in the example above) and reference that version. Ссылайтесь на него в своем проекте. - person ; 06.01.2018