我正在使用基于WPF的应用程序并使用Autofac来解析Entityframework的DbContext的依赖关系。我使用以下代码注册我的数据模块。
public class DataModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<DataContext>()
.As<IDbContext>()
.WithParameter("nameOrConnectionString", "DefaultConnectionString")
.InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(Repository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
}
}
在正常情况下使用时工作正常但在使用TPL时,由于同时调用存储库,它会产生错误,指出&#34; ExecuteReader需要一个开放且可用的连接。连接的当前状态是开放的。&#34;
在Web应用程序中,可以使用InstancePerRequest来解决此问题以解决每个请求的依赖关系,但在WPF中,我需要根据每个线程请求解析此依赖关系。有什么出路吗?
我查看了InstancePerRequest摘要或autofac,并声明此方法仅用于Web请求:
// Summary:
// Share one instance of the component within the context of a single web/HTTP/API
// request. Only available for integration that supports per-request dependencies
// (e.g., MVC, Web API, web forms, etc.).
更新
这是我用来获取数据的简单异步方法:
private async void OnLoadClientDetail()
{
long clientId = SelectedClient != null ? SelectedClient.Id : 0;
var listOfCollection = await _collectionService.GetCollectedCollectionAsync(clientId);
CollectionList = new ObservableCollection<CollectedCollection>(listOfCollection);
}
这里OnLoadClientDetail绑定到组合框的选择更改事件。当用户经常更改选择时,将多次调用此方法。 _collectionService在viewmodel中注入,并具有InstancePerLifetimeScope定义。那么如何才能为所有这些调用获得不同的范围呢?
答案 0 :(得分:0)
据我所知,您可以通过Constructor Injection注入不同事件处理程序来共享_collectionService
实例。
最好在这里使用Method Injection,这样你就可以根据需要获得每次调用的实例,然后在方法之前解析它:
builder.Register(c =>
{
var result = new MyObjectType();
var dep = c.Resolve<TheDependency>();
result.SetTheDependency(dep);
return result;
});