如何防止泄漏抽象?

Mar*_*iss 6 c# dependencies abstraction code-injection

我正在编写一个 Active Directory 包装器,试图遵循 SOLID 和其他最佳实践。该接口当前是“IActiveDirectory”。

我现在遇到的问题是实现 ActiveDirectory 必须实现 IDisposable 来处理在这个包装器中创建和处理的一些资源,我不知道如何在尝试对接口进行编码时解决这个问题,等等。 . 我不想创建有漏洞的抽象(即用 IDisposable 装饰 IActiveDirectory。)由于底层依赖项的性能,我无法使服务细化(即将资源的创建/处置范围限定为方法调用)。

我目前有一个工厂,以便 IActiveDirectory 的消费者可以按需创建一个工厂,但我需要一种干净、方便的方式让消费者用信号通知资源已完成。

如何在不泄露资源包装器抽象的情况下为消费者提供合同(即接口)?我应该只公开没有接口的实现吗?我的消费者或我的 DI 容器是否有办法管理此服务的生命周期?

ovo*_*lko 0

一方面,处置资源的责任落在获取资源的人身上。您的客户端不会创建 ActiveDirectory,而是工厂创建 - 因此从概念上讲,工厂必须处理 ActiveDirectory。

这很难,但可以实现。一个例子是 Web 应用程序,您可以将工厂范围限制为请求的范围,并在请求完成时使用活动目录安全地处置它。另一个例子是当你的实例由 IoC 容器管理时,它知道如何处理 IDisposable(NInject 有一些棘手的技巧来做到这一点)。

然后,如果这不适用于您,您应该承认通用解决方案并不是性能最好的(这一点也不奇怪),如果您仍然想要抽象,您可以创建额外的抽象 IActiveDirectorySession 来显式表示通信与 AD 进行会话,并且至少出于非常自然的原因必须实现 IDisposable。