v2.4.5.724版中的autofac注册问题 [英] autofac registration issue in release v2.4.5.724

查看:106
本文介绍了v2.4.5.724版中的autofac注册问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下注册

builder.Register<Func<Type, IRequestHandler>>(
          c => request => (IRequestHandler)c.Resolve(request));

基本上,我正在尝试注册一种工厂方法,该方法可以从给定类型解析IRequestHandler实例.

在版本2.4.3.700之前,该方法正常工作.但是现在我遇到了以下错误.

无法访问已处置的对象. 对象名称:'此解析操作已结束.什么时候 使用lambda注册组件, IComponentContext'c'参数 无法存储lambda.反而, 要么再次解析IComponentContext 来自"c",或解决基于Func<>的问题 工厂创建后续 组件.".

更新

我试图将autofac的使用范围限制在解决方案中的其余项目中.尼克,谢谢您的提示,现在我的注册像这样...

 builder.Register<Func<Type,IRequestHandler>>(c =>  
         { 
           var handlers = c.Resolve<IIndex<Type,RequestHandler>>(); 
           return  request => handlers[request];  
         });

解决方案

此表达式中的c是临时的,因此该代码在以前有效的情况下已损坏. Autofac 2.4.5可以检测到此问题,而早期版本则静默地忽略了它.

要解决此问题,请明确解决IComponentContext:

builder.Register<Func<Type, IRequestHandler>>(c => {
    var ctx = c.Resolve<IComponentContext>();
    return request => (IRequestHandler)ctx.Resolve(request));
});

您在此处模拟的功能可以使用键和索引更好地表示,例如参见 IoC的中断链 解决方案

The c in this expression is a temporary, so this code while previously functional, is broken. Autofac 2.4.5 detects this problem while earlier versions silently ignored it.

To fix the issue, explicitly resolve IComponentContext:

builder.Register<Func<Type, IRequestHandler>>(c => {
    var ctx = c.Resolve<IComponentContext>();
    return request => (IRequestHandler)ctx.Resolve(request));
});

The functionality you're emulating here might be better represented using keys and indexes, e.g. see Interrupted chain of IoC or http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices.

这篇关于v2.4.5.724版中的autofac注册问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆