WPF应用程序中使用Autofac的多线程问题

时间:2017-02-19 07:42:23

标签: c# wpf multithreading entity-framework autofac

我正在使用基于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定义。那么如何才能为所有这些调用获得不同的范围呢?

1 个答案:

答案 0 :(得分:0)

据我所知,您可以通过Constructor Injection注入不同事件处理程序来共享_collectionService实例。

最好在这里使用Method Injection,这样你就可以根据需要获得每次调用的实例,然后在方法之前解析它:

builder.Register(c =>
{
    var result = new MyObjectType();
    var dep = c.Resolve<TheDependency>();
    result.SetTheDependency(dep);
    return result;
});