Модульный тест Орлеана: поставщик типа <> 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.ProviderLoader
1.LoadProviders(IDictionary
2 конфига, 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. Но для юнит-тестов так и не удалось это сделать. Продолжайте поиск.