- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我有一个相当标准的抽象类,它允许注入(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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!