【发布时间】:2016-10-04 12:41:35
【问题描述】:
我对内置的 CM SimpleContainer 没有任何问题,但今天我需要去Simple Injector。
当我通过cal:Message.Attach 调用异步方法时,Bootstrapper 的BuildUp 方法会引发异常:
'SimpleInjector.ActivationException'类型的异常发生在 SimpleInjector.dll 但未在用户代码中处理附加信息:SequentialResult 类型的构造函数 包含名称为“枚举器”和类型的参数
IEnumerator<IResult>未注册。请确保IEnumerator<IResult>已注册,或更改构造函数 顺序结果。
这是我的引导程序类:
protected override void Configure()
{
_container.RegisterSingleton<IEventAggregator, EventAggregator>();
_container.RegisterSingleton<IWindowManager, WindowManager>();
_container.Verify();
}
protected override object GetInstance(Type service, string key)
{
var instance = _container.GetInstance(service);
if (instance != null)
return instance;
throw new InvalidOperationException("Could not locate any instances.");
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
IServiceProvider provider = _container;
Type collectionType = typeof(IEnumerable<>).MakeGenericType(service);
var services = (IEnumerable<object>)provider.GetService(collectionType);
return services ?? Enumerable.Empty<object>();
}
protected override void BuildUp(object instance)
{
var registration = _container.GetRegistration(instance.GetType(), true);
registration.Registration.InitializeInstance(instance);
}
protected override IEnumerable<Assembly> SelectAssemblies()
{
return new[] { Assembly.GetExecutingAssembly() };
}
XAML 的一部分:
<Border Grid.Row="2" Padding="10" Background="#F0F0F0" BorderBrush="#DFDFDF" BorderThickness="0,1,0,0">
<StackPanel Orientation="Horizontal">
<Button IsCancel="True" Content="{Resx Key=Close}" />
<Button IsDefault="True" MinWidth="{Resx Key=CheckOrUpdateBtnWidth, DefaultValue='115'}" Margin="8,0,0,0"
cal:Message.Attach="CheckUpdateAsync" />
</StackPanel>
</Border>
部分虚拟机:
public async Task CheckUpdateAsync()
{
IsUpdateDownloading = true;
try
{
await Task.Run(async () =>
{
Cts = new CancellationTokenSource();
var http = new HttpClient();
HttpResponseMessage rm = await http.GetAsync(UpdateInfo.DownloadUri, HttpCompletionOption.ResponseHeadersRead, Cts.Token);
long size = rm.Content.Headers.ContentLength.GetValueOrDefault();
var downloader = FileDownloader.Create(UpdateInfo.DownloadUri);
byte[] data = downloader.Download(Cts.Token);
downloader.ValidateHash(data, CloudManager.UpdateInfo.Sha256);
});
}
catch (OperationCanceledException) { }
catch (Exception ex)
{
Logger.Error(ex);
throw;
}
finally
{
IsUpdateDownloading = false;
ProgressValue = 0;
}
}
我做错了什么?
【问题讨论】:
-
你能显示相关的xaml和调用'message attach'时应该调用的代码吗?
-
@Ric.Net 我已经更新了问题。
-
我认为它击中了SequentialResult的CTOR,即
public SequentialResult(IEnumerator<IResult> enumerator) { this.enumerator = enumerator; },当它看到IEnumerator<IResult>时它不知道如何解析接口。 -
您能否详细说明创建 SequentialResult 的位置和原因?我在这里错过了更大的画面。问题很清楚,SquentialResult 没有注册。这就是为什么 .Verify() 无法在启动时向您显示您缺少 ctor 参数 IEnumerator
的注册
标签: c# wpf asynchronous caliburn.micro simple-injector