uwp - UWP Mvvm Prism 配置容器问题
问题描述
我在 UWP 应用程序中使用 Prism。我正在为每个视图模型注册一些启动参数
protected override async void ConfigureContainer()
我添加了 async 关键字,因为我想初始化一些在 ConfigureContainer() 中等待的数据库连接。但是现在我注意到应用程序启动(有时)没有启动 ags 被 instatiated 导致 null ref 异常。我不应该在这种方法中初始化任何连接吗?为什么应用程序不在 ConfigureContainer() 上等待?应用程序启动时我应该在哪里放置异步初始化方法调用?这是方法。
protected override async void ConfigureContainer()
{
// register a singleton using Container.RegisterType<IInterface, Type>(new ContainerControlledLifetimeManager());
base.ConfigureContainer();
Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
DocumentClient client = new DocumentClient(new Uri("https://docdb.etc/"),
"my key", new ConnectionPolicy() { ConnectionMode = ConnectionMode.Direct });
try
{
await client.OpenAsync();
}
catch (Exception ex)
{
throw new Exception("DocumentClient client could not open");
}
IDataAccessBM _db = new DataAccessDocDb(client, "ct", "ops");
AddressSearch addresSearcher = new AddressSearch(_db, 4);
StartUpArgs startUpArgs = new StartUpArgs
{
postCodeApiKey = "anotherKey",
db = _db,
fid = "bridge cars",
dialogService = new DialogService(),
addressSearcher = addresSearcher
};
startUpArgs.zoneSet = await _db.ZoneSetGetActiveAsync("another key");
Container.RegisterInstance(startUpArgs);
}
解决方案
我不应该在这种方法中初始化任何连接吗?
至少不是异步的。我宁愿创建一个ConnectionFactory
(可能是异步的)按需创建连接的。
为什么应用程序没有在 ConfigureContainer() 上等待?
因为不能await
void
。这就是async void
不鼓励使用 of 的原因......它是Task
in async Task
that's await
ed,而不是async
.
应用程序启动时我应该在哪里放置异步初始化方法调用?
没有async
构造函数或async new
. 在这里探索您的选择的良好开端是Stephen Cleary 的这篇文章。
Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
注册实例是丑陋的,而且大多数时候是不必要的(这是一个例子)。如果你重构你的代码让容器完成它的工作,你的异步初始化问题就会消失。
推荐阅读
- asp.net-mvc - 外部网站上的 Openid Connect 单点登录
- python - 在 sqlite3 数据库错误中插入日期时间
- jquery - 如何将引导模式设置为确认对话框?
- python - python3 arp-scan和mac解析
- python-2.7 - 如何获得 Many2one 字段取决于 Many2many 字段?
- javascript - 如何使用过滤器过滤对象数组中的数组?
- ssh - 如何修复监听端口 80 的远程端口转发失败
- javascript - CSS/jQuery 选择器来查找没有特定父元素的元素
- maven - 为什么 Maven mojo 不会删除、移动或替换文件
- git - 从任何文件夹运行“git status”会显示特定 repo 的状态