Autofac 无法从远程程序集开始解析对象(强制转换为已知类型)

安东·克鲁格洛夫

这是我的 WCF(vs2015@net452) autofac (v4.6.1) 设置:

MyService.dll:

builder.Register(c => (ISession)RemoteObjectFactory.GetInstance(typeof(MySessionBase))).As<ISession>().SingleInstance();
...
var session = AutofacHostFactory.Container.Resolve<ISession>();

<Message>An exception was thrown while executing a resolve operation. See the InnerException for details.
Could not load file or assembly "MyRemotingHost, Version=1.0.6442.29085, Culture=neutral, PublicKeyToken=null" or one of its dependencies. File not found(See inner exception for details.)</Message>
<StackTrace>at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)&#xD;
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object&amp; instance)&#xD;
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)&#xD;
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)&#xD;
at My.DoSomeWork() at C:\Projects\...
<Type>Autofac.Core.DependencyResolutionException</Type>

MyService.dll指的是MyDefs.dll

MyRemotingHost.dll指的是MyDefs.dll

MyService.dllMyRemotingHost.dll通过远程调用RemoteObjectFactory.GetInstance是一个包装器方法,它返回(通过远程处理)透明代理到MySession对象MyRemotingHost.dll

抽象类MySessionBase实现ISession. 两者都在 中定义MyDefs.dll

MySession是 的子MySessionBase并在 中定义MyRemotingHost.dll

严格来说MyService.dll不知道也不MyRemotingHost.dll应该知道。为什么 autofac 会尝试获取有关此远程程序集的信息?

更新

ISession session = (MySessionBase)RemoteObjectFactory.GetInstance(typeof(MySessionBase));
builder.RegisterInstance(session);

RegisterInstance 抛出同样的错误。

Update2第二次(及后续)解析尝试不会抛出奇怪的错误。

builder.Register(c => (ISession)RemoteObjectFactory.GetInstance(typeof(MySessionBase))).As<ISession>().SingleInstance();
...
var session1 = AutofacHostFactory.Container.Resolve<ISession>();
var session2 = AutofacHostFactory.Container.Resolve<ISession>();

var session1 = ...抛出错误。如果错误被抑制,则下一行var session2 = ...不会产生错误。

基于 PDB 的逐步调试显示错误源在第一次调用枚举器时位于Autofac.Core.Resolving.ResolveOperation内部foreach循环:

private void CompleteActivations()
{
    var completed = _successfulActivations;
    ResetSuccessfulActivations();

    foreach (var activation in completed)
        activation.Complete();
}

我无法进行更多调查,因为我坚持使用 VS2015,而 autofac 源已经具有 VS2017 格式。

安东·克鲁格洛夫

问题出在log4net autofac 模块中

var instanceType = instance.GetType();

在该行之前添加检查可以解决问题:

// cant use GetType() on TransparentProxy as it may throw error
if (RemotingServices.IsTransparentProxy(instance)) return;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法使用dotnet core和autofac将ServiceCollection类型的对象强制转换为类型'Autofac.ContainerBuilder'

来自分类Dev

Autofac实例范围解析

来自分类Dev

从温莎城堡转换为Autofac

来自分类Dev

AutoFac无法按类型正确解析

来自分类Dev

Autofac无法从asp.net 5中的程序集扫描解析类型

来自分类Dev

静态方法中的Autofac解析

来自分类Dev

使用Autofac的OWIN服务解析

来自分类Dev

Autofac注册并使用名称解析

来自分类Dev

静态方法中的Autofac解析

来自分类Dev

管理UnitOfWork的AutoFac对象创建

来自分类Dev

使用AutoFac向对象注册

来自分类Dev

Autofac无法解决注入的属性

来自分类Dev

Autofac无法解决注入的属性

来自分类Dev

Autofac解析相同类型的多个实例

来自分类Dev

如何使用Autofac容器解析类型的实例?

来自分类Dev

使Autofac注入接口的已解析类型

来自分类Dev

WebApi-Autofac无法解析参数HttpRequestMessage

来自分类Dev

WebApi-Autofac无法解析参数HttpRequestMessage

来自分类Dev

Autofac无法解析ApiController的类型和命名参数

来自分类Dev

在构造函数无法解析的键枚举上注册的Autofac类型

来自分类Dev

在构造函数无法解析的键枚举上注册的Autofac类型

来自分类Dev

无法加载文件或程序集'Autofac,版本= 3.0.0.0

来自分类Dev

Autofac 注入对象的属性而不是对象

来自分类Dev

基于类属性/元数据的Autofac解析

来自分类Dev

使用autofac动态解析WCF端点地址

来自分类Dev

用于键注册的AutoFac解析界面

来自分类Dev

运行时中的Autofac解析参数

来自分类Dev

AutoFac解析界面,用于按键注册

来自分类Dev

Autofac按名称解析依赖服务