c# - Autofac - 单例接口(interface)解析为 transient

标签 c# inversion-of-control autofac

我正在构建一个 WPF 应用程序并将 Autofac 用作 IoC 容器。这个场景有点难以描述,但我会尝试在下面给出相关的代码:

我的应用 Bootstrap 包含以下代码以在我的应用中注册 View 模型:

builder.RegisterAssemblyTypes(assemblySource)
       .Where(type => type.Name.EndsWith("ViewModel"))
       .Where(type => !string.IsNullOrWhiteSpace(type.Namespace) && type.Namespace.Contains("ViewModels"))
       .AssignableTo<INotifyPropertyChanged>()
       .AsSelf()
       .InstancePerDependency();

(注意我必须调用的 InstancePerDependency() 调用,因为我显示了一个 View 的许多实例)

然后我有以下代码来注册一个开放泛型的实现者:

builder.RegisterAssemblyTypes(assemblySource)
       .AsClosedTypesOf(typeof(INotificationHandler<>))
       .AsSelf()
       .SingleInstance();

为了避免将容器传递到我的事件调度程序中,我将它传递给一个委托(delegate),如下所示:

builder.Register<ServiceFactory>(ctx => { return t => Container.Resolve(t ); });

最后一段代码给我带来了一个问题:它导致了实现 INotificationHandler 的 ViewModels接口(interface)在每次调用时创建实例,而我只需要解析一次实例,而实现此通用接口(interface)的 ViewModels 将在整个应用程序中只创建一个实例。

问题是:如何让 Autofac 解析实现 INotificationHandler<T> 的 ViewModel 的单个实例界面,同时保留要创建的其他 ViewModels PerDependency

谢谢。

最佳答案

您需要在第一次注册时排除实现 INotificationHandler<> 的 ViewModel。因此,将您的第一次注册更改为:

builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly())
            .Where(type => type.Name.EndsWith("ViewModel"))
            .Where(type => !string.IsNullOrWhiteSpace(type.Namespace) && type.Namespace.Contains("ViewModels"))
            .Where(type => !type.IsAssignableFrom(typeof(INotificationHandler<>)))
            .AssignableTo<INotifyPropertyChanged>()
            .AsSelf()
            .InstancePerDependency();

关于c# - Autofac - 单例接口(interface)解析为 transient ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51351185/

相关文章:

c# - .Net Framework 4.5 的升级应用程序 - 无法获得正确的 DataAnnotations 程序集

c# - 当我从 Ioc 配置中使用时,我收到错误信息(无法在泛型类型或方法中用作类型参数 'TTo')

entity-framework-4 - 在多层架构中使用 Autofac

c# - 类型 '***' 不可分配给 Autofac 中的服务 '***'

asp.net-web-api - 多个 owin 监听器拥有自己的一组 Controller ,并使用 Autofac for DI

c# - Visual Studio 单元测试文件路径烦恼

c# - 从 silverlight 应用程序生成当前项目的文件名列表?

c# - 如何产生精确定时的音调和静音?

.net - Unity 中无属性的 Setter/属性注入(inject)

c# - 如何在Module中使用container.Resolve?