我正在使用C#使用Active Directory。实例化PrincipalContext
对象似乎很昂贵,所以我想在类变量中存储一个。
使用PrincipalContext
作为局部变量时,我可以使用方便的using
语法。在静态变量中存储IDisposable
对象时,如何确保对象被正确处理?
答案 0 :(得分:7)
这样做的一般模式是在您的类上实现IDisposable
接口。举个例子:
public class YourClass : IDisposable
{
private OtherDisposableType yourResource;
public YourClass()
{
yourResource = new OtherDisposableType();
}
public void Dispose()
{
yourResource.Dispose();
}
}
这至少是您需要做的事情。
修改强>
我之前的版本主张在所有情况下遵循终结器模式,这是(正确地)指出是违反框架设计指南的。但是,如果您实际处理非托管资源(例如,您正在进行直接P / Invoke调用并获取需要显式释放的句柄),建议您创建终结器并调用{{1在其中,以防止使用您的代码并且不调用Dispose
的人:
Dispose
答案 1 :(得分:2)
查看System.ComponentModel
命名空间的作用。基本上,我通常使用的模式是拥有一个子组件集合,其中包括我拥有的不是“值”的所有内容 - 无论它是否实现IDisposable
。
然后,当我自己Dispose()
时,我会迭代此集合并Dispose
实现IDisposable
的所有内容。
这种技术的一个优点是,如果我拥有的对象开始不是Disposable,但后来添加了IDisposable
接口,我的类将做正确的事情,而不必更改。
此外,使用DI / IoC容器可以为您处理大部分内容。
答案 2 :(得分:1)
所以基本上你想要缓存昂贵的资源。这是件好事。
全球数据(在这种情况下是静态变量)并不是一件好事,恕我直言。相反,为什么不把它变成实例变量并控制生命周期呢?
编写处理AD职责的类,让它创建并使用PrincipalContext,并使其成为IDisposable(使用Dispose Pattern)。从中提取一个接口以将其解耦并使使用它的类更容易测试。
要使用AD服务的类将采用新接口(Dependency Injection或DI)的构造函数参数。您可以在using块中手动创建类,并将其传递给类或使用DI Container Framework。您可以让框架将AD对象的生命周期设置为容器的生命周期(也可以是IDisposable)。有关详细信息,请参阅How do you reconcile IDisposable and IoC?和您的DI Container文档。