Модульный тест Орлеана: поставщик типа <> name По умолчанию не загружен

У меня есть следующая проблема. Я пытаюсь реализовать модульный тест для зерна Орлеана, но при запуске он не может найти поставщика данных по умолчанию. Исключение происходит при вызове конструктора. Вот код: Класс модульного теста

   [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>

У меня ошибка заключается в следующем:

Уровень 0: Orleans.Runtime.OrleansException: поставщик типа NBOOC.Grains.StorageProviders.CustomSqlStorageProvider,NBOOC.Grains name Значение по умолчанию не загружено. Убедитесь, что вы развернули сборку, в которой класс поставщика определен в папке выполнения.

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

на Orleans.Providers.ProviderLoader1.LoadProviders(IDictionary2 конфига, IProviderManager providerManager)

в Orleans.Runtime.Storage.StorageProviderManager.LoadStorageProviders (IDictionary`2 configs)

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

Как видите, есть провайдер с именем Default с полностью указанным типом. Указанный там класс доступен, так как все ссылки там есть - я проверил это явно, все DLL-файлы помещены в ту же папку, что и DLL модульного теста. Я также проверил все версии библиотеки Orleans DLL - они все те же 1.0.10.0, так что это не проблема версии. Кто-нибудь когда-нибудь сталкивался с такой вещью? Есть идеи как это исправить?

PS Кстати, если вы найдете это полезным. Я скачал исходники Орлеана и отследил место, где происходит исключение - есть класс ProviderLoader, в нем есть словарь словаря провайдеров, но по какой-то причине он пуст.

1 ответ

В случае, если кто-то найдет это полезным. Основная причина и возможное решение. Первопричина. Проблема возникает из-за того, что при запуске теста OrleansRuntime пытается сделать следующее: он получает местоположение сборки и загружает все типы из всех библиотек DLL, которые он находит в папке рядом с собой. Проблема возникает из-за того, что.NET выполняет теневое копирование и загружает не DLL из вашей папки (т.е. \MyTestProject\bin\Debug), а из чего-то вроде этого: C:\Users\__User__\AppData\Local\assembly\dl3\L1Q53XP9.XXK\Y5C28WBO.YKY\ - есть папки для каждой DLL. Но, как мы видим, там не будет DLL-файлов (ваших гранул) (а также, например, библиотек Орлеана для MemotyStorage), поэтому загрузка не удастся. Возможное решение состоит в том, чтобы как-то отключить это теневое копирование - например, это может быть настройка в web.config. Но для юнит-тестов так и не удалось это сделать. Продолжайте поиск.

Другие вопросы по тегам