Исключение StructureMap: точка входа не найдена в проекте NServiceBus для интеграции EPiServer

Я пытаюсь инициализировать конечную точку NServiceBus (v4.3.2), которая вызывает EPiServer.Framework (v7.0.859.1) и другие библиотеки Mediachase (v7.0.243) для инициализации доступа к базе данных. Мой класс ServerEndpoint реализует NServiceBus.IWantToRunWhenTheBusStopsAndStarts. Его конструктор зависит от StructureMap.IContainer, чтобы использовать контейнер в процедуре инициализации Start(). Я добавил в проект зависимости для использования StructureMap 2.6.4 с NServiceBus.

Однако при запуске конечной точки я продолжаю получать System.EntryPointNotFoundException исключение с сообщением «Точка входа не найдена»:

2014-01-07 23:16:30,581 [14] ERROR NServiceBus.Unicast.UnicastBus [(null)] <(null)> - System.EntryPointNotFoundException: Entry point was not found.
   at StructureMap.IContainer.Configure(Action`1 configure)
   at Mediachase.Commerce.Initialization.CommerceInitialization.ConfigureContainer(ServiceConfigurationContext context)
   at clin.Integration.Commerce.Initialization.InitCommerceServices(IContainer container1) in c:\dev\clin\kimball\Trunk\NServiceBus\clin.ServiceBus\clin.Integration.Commerce\Initialization.cs:line 18
   at clin.Web.CatalogChangeEndpoint.ServerEndpoint.Start() in c:\dev\clin\kimball\Trunk\NServiceBus\clin.ServiceBus\clin.Web.CatalogChangeEndpoint\CatalogChangeEndpoint.cs:line 26
   at NServiceBus.Unicast.UnicastBus.<>c__DisplayClass1d.<Start>b__1b() in y:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 804 could not be started.

Мой класс стартапа:

class ServerEndpoint : IWantToRunWhenBusStartsAndStops
{
    public ServerEndpoint(StructureMap.IContainer container)
    {
        _container = container;
    }

    public void Start()
    {
        Integration.Commerce.Initialization.InitCommerceServices(_container);
        Integration.Commerce.Catalog.InitCommerceCatalog();
    }

    public void Stop() { }

    public IContainer _container { get; set; }
 }

Процедура инициализации:

public static void InitCommerceServices(IContainer container)
{
   var locator = new EPiServer.ServiceLocation.StructureMapServiceLocator(container);
   var context = new EPiServer.ServiceLocation.ServiceConfigurationContext(HostType.Undefined, container);
   new Mediachase.Commerce.Initialization.CommerceInitialization().ConfigureContainer(context);
   EPiServer.ServiceLocation.ServiceLocator.SetLocator(locator);
}

Конфигурация конечной точки:

public class EndpointConfig : IConfigureThisEndpoint, IWantCustomInitialization, AsA_Server
{
    public void Init()
    {
        Configure.Serialization.Json();
        Configure.With()
            .StructureMapBuilder()
            .DefiningCommandsAs(MsgConvention.MessageConventions.IsCommandType)
            .DefiningEventsAs(MsgConvention.MessageConventions.IsEventType)
            .DefiningMessagesAs(MsgConvention.MessageConventions.IsInternalMessage);
    }
}

Я не запускаю этот код в веб-приложении (очевидно?).

Я сделал следующее, чтобы попытаться решить проблему:

  • Проверьте версии ссылочных сборок на наличие конфликтов
  • Вместо использования внедрения зависимостей создайте локальную переменную контейнера в InitCommerceServices, например container = StructureMap.ObjectFactory.Container;.

person DrewDouglas    schedule 08.01.2014    source источник
comment
Можете ли вы опубликовать трассировку стека?   -  person John Simons    schedule 08.01.2014
comment
@John Спасибо, что заглянули. Извините, что потратил ваше время.   -  person DrewDouglas    schedule 09.01.2014


Ответы (1)


Оказалось, что это конфликт между разными версиями StructureMap. (Есть много значений System.EntryPointNotFoundException). Исходная DLL-библиотека StructureMap была от EPiServer и установлена ​​в GAC. Более новая StructureMap была из пакета Nuget NServiceBus для StructureMap. Я разрешил конфликт между двумя версиями, добавив перенаправление привязки в App.config каждой конечной точки под элементом <configuration>/<runtime>, как описано на этой странице msdn

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
    <assemblyIdentity name="StructureMap" publicKeyToken="e60ad81abae3c223" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.4.0" newVersion="2.6.4.0" />
    </dependentAssembly>
</assemblyBinding>

Дополнительное примечание: NuGet должен автоматически добавлять перенаправление привязки при обновлении пакета. Я не знаю, происходит ли это при установке пакета, а не при его обновлении. Поскольку мы используем SlowCheetah, я никогда не узнаю, сделал ли он это в данном случае. Преобразования файла конфигурации используют наш собственный файл в качестве исходного файла App.config и при генерации будут перезаписывать файлы. (Возможно, эта проблема является основанием для использования исходного файла в качестве источника преобразования SlowCheetah.)

person DrewDouglas    schedule 09.01.2014
comment
Та же проблема может возникнуть при инициализации любой части EPiServer :) Например - это касается DDS - ›world.episerver.com/Modules/Forum/Pages/Thread.aspx?id=77094 Итак, если вы видите такую ​​ошибку - первое, что нужно проверить, - это правильность привязки StructureMap. - person wałdis iljuczonok; 11.03.2014