我正在编写一个需要使用.NET Remoting与服务器通信的小应用程序。我正在使用AutoFac来注册我的实例,并在处理我的远程代理对象时遇到问题,这里有一些示例代码:
builder.Register(b =>
{
var channel = new TcpClientChannel();
// ...
var remoteObj = (IMyComponent)Activator.GetObject(typeof(IMyComponent), "tcp://...");
return remoteObj;
}).As<IMyComponent>();
// ... and then when using it:
using (var scope = this.container.BeginLifetimeScope()) {
var myComponent = scope.Resolve<IMyComponent>();
} // <= An exception will be thrown here since AutoFac will try to call .Dispose on myComponent
// Later I realized that the exception can be fixed by specifying an "empty" OnRealease-behavior when registering the component, probably because AutoFac doesnt try to treat MyComponent like an IDisposable.
...
}).As<MyIComponent>().OnRelease(c => { //Manual disposing here });
这个例外让我想知道我是否在这里做了一些完全错误的事情,以及我应该如何正确处理远程代理的生命周期。我的方法有什么问题,即通过AutoFac“创建”并返回远程代理吗?如果是这样,应该如何处理远程代理的生命周期?
答案 0 :(得分:1)
There are some detailed docs on how Autofac handles disposal on the Autofac doc site.这可能有助于澄清您的一些问题。
如果您有一个IDisposable
组件,您不希望Autofac为您拨打Dispose
,请将其注册为ExternallyOwned
,并禁用自动处理。