C#2008
我一直在研究这个问题,我仍然对一些问题感到困惑.我的问题如下
我知道如果你处理非托管资源,你只需要一个终结器.但是,如果您使用托管资源来调用非托管资源,您是否仍需要实现终结器?
但是,如果您开发一个不直接或间接使用任何非托管资源的类,您是否可以实现IDisposable该类,以便您的类的客户端可以使用'using statement'?
是否可以接受实现IDisposable,以便您的类的客户端可以使用using语句?
using(myClass objClass = new myClass())
{
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)我在下面开发了这个简单的代码来演示Finalize/dispose模式:
public class NoGateway : IDisposable
{
private WebClient wc = null;
public NoGateway()
{
wc = new WebClient();
wc.DownloadStringCompleted += wc_DownloadStringCompleted;
}
// Start the Async call to find if NoGateway is true or false
public void NoGatewayStatus()
{
// Start the Async's download
// Do other work here
wc.DownloadStringAsync(new Uri(www.xxxx.xxx));
}
private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
// …Run Code Online (Sandbox Code Playgroud)我终于在C#中围绕IoC和DI缠绕我的头,并且正在努力解决一些问题.我正在使用Unity容器,但我认为这个问题适用范围更广.
使用IoC容器来分配实现IDisposable的实例让我感到害怕!你怎么知道你应该Dispose()?该实例可能是专门为您创建的(因此您应该Dispose()它),或者它可能是其生命周期在其他地方管理的实例(因此您最好不要).代码中没有任何内容告诉您,实际上这可能会根据配置发生变化!这对我来说似乎是致命的.
任何IoC专家都可以描述处理这种模糊性的好方法吗?
我建议在使用IOC容器时,我应该改变这个:
class Foobar: IFoobar, IDisposable {};
Run Code Online (Sandbox Code Playgroud)
进入:
interface IFoobar: IDisposable{};
class Foobar : IFoobar{};
Run Code Online (Sandbox Code Playgroud)
我想知道这是否正常,或者它是否解决了一个问题并创造了另一个问题.它肯定解决了我非常想要这样做的问题:
using( IFoobar = myContainer.Resolve<IFoobar>() )
{ ... }
Run Code Online (Sandbox Code Playgroud)
现在我知道任何替代品都不会导致运行时错误.
另一方面,现在我的所有模拟对象也必须处理IDisposable.我是对的,大多数任何模拟框架都能轻松处理这个问题吗?如果是,那么也许这不是问题.
或者是吗?我应该注意另一个隐藏的问题吗?这当然发生,我认为如果我使用IoC容器没有单元测试/嘲讽,但对于真正的服务的独立性,那么这可能是因为也许只有我的交换服务,一个真正与非托管资源交易(和现在我是一个问题我必须在这些其他服务中实现空的"IDispose"操作).
即使是后一个问题,我想我可以忍受,为了获得使用上面演示的"使用"声明的能力.但是,我是遵循一个流行的惯例,还是我错过了一个完全不同的更好的解决方案?