3

EPiServer.Framework (v7.0.859.1) およびその他の Mediachase (v7.0.243) ライブラリを呼び出してデータベースへのアクセスを初期化する NServiceBus (v4.3.2) エンドポイントを初期化しようとしています。私のクラスServerEndpointは を実装してNServiceBus.IWantToRunWhenTheBusStopsAndStartsいます。StructureMap.IContainerそのコンストラクターは、初期化ルーチンで使用するコンテナーを取得するために に依存しStart()ます。NServiceBus で StructureMap 2.6.4 を使用するための依存関係をプロジェクトに追加しました。

ただし、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);
    }
}

私はこのコードを Web アプリケーション内で実行していません (明らかに?)。

問題を解決するために、次のことを行いました。

  • 参照されているアセンブリのバージョンの競合を確認する
  • container = StructureMap.ObjectFactory.Container;依存性注入を使用する代わりに、InitCommerceServices でローカル コンテナー変数を作成します。
4

1 に答える 1

4

StructureMap の異なるバージョン間の競合であることが判明しました。( System.EntryPointNotFoundException には多くの意味があります)。元の StructureMap dll は EPiServer からのもので、GAC にインストールされていました。新しい StructureMap は、StructureMap の NServiceBus の nuget パッケージからのものでした。このmsdnページで<configuration>/<runtime>説明されているように、要素の下の各エンドポイントのApp.configにバインディングリダイレクトを追加することにより、2つのバージョン間の競合を解決しました

<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 変換のソースとして使用するケースになります。)

于 2014-01-09T04:27:02.977 に答える