嘿,我有一个来自第三方DLL的基类,它依赖于一次性的.Context: IDisposable

public class BaseValidator
{
    public BaseValidator(Context context) {}
}

我们正试图摆脱将类与这些依赖项Bundle 在一起.所以我们开始转而依赖供应商

public interface IContextProvider 
{
    Context Create();
}

我正在编写一个新的验证器,它继承了BaseValidator,但我希望它依赖于IContextProvider.所以我想在继承的构造函数中创建上下文,但我想在析构函数中处理它以防止内存泄漏,但是我不确定这是否可能.

public class EntityValidator: BaseValidator 
{
    public EntityValidator(IContextProvider provider) : base(provider.Create()) 
    {
    }

    ~EntityValidator()
    {
        //I'm not how I can dispose the entity I've passed into it.
    }
}

我的问题是,有没有什么技巧可以用来捕获传递到基数中的变量?

Note:我知道我可以通过外部助手类来解决问题,但我很感兴趣的是,是否有人知道如何以一种更明智的方式做到这一点.

推荐答案

如果BaseValidator类不以公共方式公开Context,那么您当前的设计将需要您使用反射和对BaseValidator的内部实现的知识来处理它,这当然是脆弱的.

相反,我将使用中间构造函数捕获上下文:

Context _context;
private EntityValidator(Context context) : base(context) 
{ 
    _context = context;
}
public EntityValidator(IContextProvider provider) : this(provider.Create())
{
    
}

请注意,通过终结器(也称为析构函数)不是理想的due to constraints,它放在垃圾收集器上.相反,我会让EntityValidator个工具IDisposable

Csharp相关问答推荐

如何在asp.net C#中获取视频文件的视频时长?

无法使用命令提示符创建空的dotnet核心Web应用程序

C# uwp中的Win11启动屏幕剪辑工作方式不同

TDLib与机器人共享电话号码

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

不带身份的Blazor服务器.Net 8 Cookie身份验证

如何解决提交按钮后 Select 选项错误空参照异常

获取具有AutoFaces的所有IOptions对象的集合

如何在C#中实现非抛出`MinBy`?

为什么C#认为这个非托管 struct 有一个重叠

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

在try 使用访问服务器上的文件夹时,如何解决CORS错误.NET核心API

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

System.NotSupportdException:流不支持读取

Blazor:搜索框在第一次搜索时不搜索

Azure函数正在返回值列表,但该列表在Chrome中显示为空

Azure队列触发器未使用隔离的工作进程执行

实例化列表时的集合表达式是什么?