Исключение 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.
Мой класс Startup:
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;
вместо использования внедрения зависимости.
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.)