【发布时间】:2017-08-21 14:51:34
【问题描述】:
这是我的 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)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
at My.DoSomeWork() at C:\Projects\...
<Type>Autofac.Core.DependencyResolutionException</Type>
MyService.dll 指的是MyDefs.dll。
MyRemotingHost.dll 指的是MyDefs.dll。
MyService.dll 通过远程调用MyRemotingHost.dll。 RemoteObjectFactory.GetInstance 是一个包装器方法,它从MyRemotingHost.dll 返回(通过远程处理)透明代理到MySession 对象。
抽象类MySessionBase 实现ISession。两者都在MyDefs.dll 中定义。
MySession 类是MySessionBase 的子类,在MyRemotingHost.dll 中定义。
严格来说MyService.dll 不知道MyRemotingHost.dll,也不应该知道。那么为什么 autofac 会尝试获取有关此远程程序集的信息??
更新
ISession session = (MySessionBase)RemoteObjectFactory.GetInstance(typeof(MySessionBase));
builder.RegisterInstance(session);
RegisterInstance 抛出同样的错误。
更新2 第二次(和后续)解决尝试不会抛出错误,这很奇怪。
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 的逐步调试显示错误源在第一次调用枚举器时位于 foreach 循环内的 Autofac.Core.Resolving.ResolveOperation:
private void CompleteActivations()
{
var completed = _successfulActivations;
ResetSuccessfulActivations();
foreach (var activation in completed)
activation.Complete();
}
我无法进行更多调查,因为我坚持使用 VS2015,而 autofac 源已经具有 VS2017 格式。
【问题讨论】:
-
这听起来像是一个 100% 的远程处理问题,与 Autofac 一点关系都没有,尤其是当您将 Autofac 从图片中移除时也会弹出错误。您可能会考虑将问题标题更新为更面向远程的内容,以便获得正确的关注。
-
没有 autofac 时不会弹出错误。
Session是透明代理。这似乎是问题所在。 -
也许我理解错了。如果您不调用
RegisterInstance,那么对象session可以吗?目前还不清楚是调用RemoteObjectFactory.GetInstance是导致问题的原因还是通过Autofac 的解决方法。从“更新”中听起来像是对RemoteObjectFactory.GetInstance的调用,这意味着与远程处理相关的标题可以为您提供更合适的帮助。 -
我已编辑更新以使其清晰。没有 autofac 它工作正常。
-
@TravisIllig Update2 - 错误仍然存在,但它只发生一次,这很奇怪。
标签: c# wcf dependency-injection autofac remoting