我遇到了以下问题。 我试图为Orleans谷物实施单元测试,但在启动时无法找到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 level 0:Orleans.Runtime.OrleansException:类型的提供者 NBOOC.Grains.StorageProviders.CustomSqlStorageProvider,NBOOC.Grains 名称默认未加载。请检查您是否已部署 将提供程序类定义为执行的程序集 文件夹中。
在Orleans.Providers.ProviderLoader`1.ValidateProviders()
在Orleans.Providers.ProviderLoader
1.LoadProviders(IDictionary
2 配置,IProviderManager providerManager)在 Orleans.Runtime.Storage.StorageProviderManager.LoadStorageProviders(IDictionary`2 CONFIGS)
在 Orleans.Runtime.Scheduler.SchedulerExtensions&LT;&GT; c__DisplayClassa&LT; b__8&GT; d__c.MoveNext()
如您所见,有一个名称为Default且具有完全指定类型的提供程序。在那里指定的类是可访问的,因为所有引用都在那里 - 我已经明确地检查了这个,所有DLL都放在与单元测试DLL相同的文件夹中。我还检查了Orleans DLL的所有版本 - 它们都是1.0.10.0,所以它不是版本问题。 有没有人遇到过这样的事情?任何想法如何解决它?
P.S。顺便提一下,如果你发现它有帮助的话。我已经下载了Orleans源代码并追踪发生异常的地方 - 有一个ProviderLoader类,它有一个提供者Dictionary的字典但由于某种原因它是空的。
答案 0 :(得分:0)
万一有人觉得有帮助。根本原因和可能的解决方案 根本原因。出现问题的原因是,在测试启动时,OrleansRuntime尝试执行以下操作:它获取程序集的位置,并从其自身附近的文件夹中找到的所有DLL中加载所有类型。 出现此问题是因为.NET执行卷影复制并从您的文件夹(即\ MyTestProject \ bin \ Debug)加载不是DLL,但是从这样的东西 - C:\ Users \ __ User __ \ AppData \ Local \ assembly \ dl3 \ L1Q53XP9 .XXK \ Y5C28WBO.YKY \ - 每个DLL都有文件夹。但是我们可以看到那里没有DLL-s(你的谷物)(例如MemotyStorage的Orleans DLL),所以加载会失败。 可能的解决方案是以某种方式禁用此影子复制 - 例如,它可能是在web.config中设置。 但是对于单元测试仍然没有设法做到这一点。继续搜索。