gpt4 book ai didi

c# - C# 中的 IDisposable 实现 - 是否可选处置注入(inject)的 IDisposable OK?

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:41 26 4
gpt4 key购买 nike

如果我有一个相当标准的抽象类,它允许注入(inject)一个 IDisposable 实例。但是,一些继承自此类的类不应处置注入(inject)的存储库,而其他类则应处置。显而易见的解决方案是有一个构造函数:

public abstract class WorkspaceViewModel : IDisposable
{
readonly bool _cascadeDisposeRepository;
protected WorkspaceViewModel(IRepository repository, bool cascadeDisposeRepository=true)
{
_repository = repository;
_cascadeDisposeRepository = cascadeDisposeRepository;
}

编辑:

我还有一个构造函数

    protected WorkspaceViewModel()
:this(new RepositoryA(), true){}

结束编辑

然后在recomended microsoft manner中实现Dispose方法

protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_cascadeDisposeRepository) { _repository.Dispose(); }
.....

但是,我从未见过以这种方式实现 IDisposable,我想知道这是否是一种不好的做法(如果是,为什么,还有哪些其他解决方案更可取)。

谢谢你的想法。

编辑:Mark 的评论让我意识到更好的实现可能是没有无参数构造函数,强制任何继承自 WorkspaceViewModel 的类创建和处置它们自己的实例(并选择实现 IDisposable),同时从 WorkspaceViewModel 的实现接口(interface)中删除 IDisposable。

最佳答案

由于您没有非托管资源的句柄,我建议您完全删除 IDisposable。

因为你的类是一个存储库,我怀疑它使用了一个数据库连接,它可能间接地拥有一个非托管资源的句柄 - 所以只记得将它包装在一个 using:

using(var myConn = new Connection(connectionString))
{
}

然后您可以让托管代码的美妙之处在于销毁和保持事件的内容 - 您甚至不需要考虑它。

关于c# - C# 中的 IDisposable 实现 - 是否可选处置注入(inject)的 IDisposable OK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19486168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com