0

次の問題があります。Orleans Grain の単体テストを実装しようとしていますが、開始時に dataprovider Default が見つかりません。例外はコンストラクター呼び出しで発生します。コードは次のとおりです。単体テストクラス

   [TestFixture]
    public class SdxRemindersTest : TestingSiloHost
    {
        public SdxRemindersTest ()
            : base(new TestingSiloOptions
            {
                StartPrimary = true,
                StartSecondary = false,
                SiloConfigFile = new FileInfo("OrleansConfiguration.xml")

            }, new TestingClientOptions {ClientConfigFile = new FileInfo("ClientConfiguration.xml")})
        {
        }

// methods here.........
    }

ここに私の設定ファイル OrleansConfiguration.xml があります

<?xml version="1.0" encoding="utf-8"?>
<OrleansConfiguration xmlns="urn:orleans">
  <Globals>
    <StorageProviders>
      <Provider Type="NBOOC.Grains.StorageProviders.CustomSqlStorageProvider"
                          Name="Default"
                          Database=""
                          ConnectionString="" />

     </StorageProviders>
    <StreamProviders>
      <Provider Type="Orleans.Providers.Streams.SimpleMessageStream.SimpleMessageStreamProvider" Name="SMSProvider" FireAndForgetDelivery="false"/>
    </StreamProviders>
    <BootstrapProviders>
      <Provider Type="NBOOC.Grains.OrleansApp" Name="OrleansApp"   />
    </BootstrapProviders>
    <SeedNode Address="localhost" Port="22222"/>
    <Messaging ResponseTimeout="30s"/>
    <ReminderService ReminderServiceType="ReminderTableGrain"/>

  </Globals>
  <Defaults>
    <Networking Address="localhost" Port="22222"/>
    <ProxyingGateway Address="localhost" Port="40000" />
    <Tracing DefaultTraceLevel="Warning" TraceToConsole="true" TraceToFile="{0}-{1}.log" PropagateActivityId="false" BulkMessageLimit="1000">
      <TraceLevelOverride LogPrefix="Application" TraceLevel="Verbose3" />

      <LogConsumer>NBOOC.Grains.Utils.LogConsumer,NBOOC.Grains</LogConsumer>
    </Tracing>
    <Statistics MetricsTableWriteInterval="30s" PerfCounterWriteInterval="30s" LogWriteInterval="300s" WriteLogStatisticsToTable="true" StatisticsCollectionLevel="Info"/>
  </Defaults>
</OrleansConfiguration>

私が持っているエラーはこれです:

Exc レベル 0: Orleans.Runtime.OrleansException: 型 NBOOC.Grains.StorageProviders.CustomSqlStorageProvider,NBOOC.Grains 名のプロバイダー デフォルトが読み込まれませんでした。プロバイダー クラスが定義されているアセンブリを実行フォルダーにデプロイしたことを確認してください。

Orleans.Providers.ProviderLoader`1.ValidateProviders() で

Orleans.Providers.ProviderLoader 1.LoadProviders(IDictionary2 構成、IProviderManager providerManager で)

Orleans.Runtime.Storage.StorageProviderManager.LoadStorageProviders (IDictionary`2 構成) で

Orleans.Runtime.Scheduler.SchedulerExtensions.<>c__DisplayClassa.<b__8>d__c.MoveNext() で

ご覧のとおり、完全に指定されたタイプの Default という名前のプロバイダーがあります。そこに指定されたクラスは、すべての参照が存在するためアクセス可能です。これを明示的に確認しました。すべての DLL は、単体テスト DLL と同じフォルダーに配置されています。また、Orleans DLL のすべてのバージョンを確認しました。これらはすべて同じ 1.0.10.0 であるため、バージョンの問題ではありません。誰もそのようなことに直面したことがありますか?それを修正する方法はありますか?

PS ところで、参考になる場合に備えて。Orleans のソースをダウンロードし、例外が発生する場所を追跡しました。ProviderLoader クラスがあり、プロバイダーのディクショナリがありますが、何らかの理由で空です。

4

1 に答える 1

0

誰かが役に立つと思った場合。根本原因と考えられる解決策。根本的な原因。この問題は、テストの開始時に OrleansRuntime が次の処理を試行するために発生します: アセンブリの場所を取得し、それ自体の近くのフォルダーで見つかったすべての DLL からすべての型をロードします。この問題は、.NET がシャドウ コピーを実行し、DLL をフォルダー (つまり、\MyTestProject\bin\Debug) からではなく、次のようなものからロードするために発生します - C:\Users\__User__\AppData\Local\assembly\dl3\L1Q53XP9 .XXK\Y5C28WBO.YKY\ - 各 DLL のフォルダーがあります。しかし、ご覧のとおり、そこには DLL-s (あなたの穀物) がないので (たとえば、MemotyStorage 用の Orleans DLL も)、ロードは失敗します。考えられる解決策は、このシャドウ コピーを無効にすることです。たとえば、web.config で設定することができます。しかし、単体テストについてはまだしませんでした」これを行うことができません。検索を続けます。

于 2016-01-26T13:06:55.037 に答える