处理“远程代理对象”生命周期的建议方法

时间:2014-10-16 09:48:50

标签: c# .net autofac

我正在编写一个需要使用.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“创建”并返回远程代理吗?如果是这样,应该如何处理远程代理的生命周期?

1 个答案:

答案 0 :(得分:1)

There are some detailed docs on how Autofac handles disposal on the Autofac doc site.这可能有助于澄清您的一些问题。

如果您有一个IDisposable组件,您不希望Autofac为您拨打Dispose,请将其注册为ExternallyOwned,并禁用自动处理。