gpt4 book ai didi

c# - 类应该同时实现 IAsyncDisposable 和 IDisposable 吗?

转载 作者:行者123 更新时间:2023-12-03 14:22:45 31 4
gpt4 key购买 nike

例如我有这个类:

public class UnitOfWork : IUnitOfWork
{
private readonly ApplicationDbContext _context;

public IProductRepository Products { get; private set; }
public ICategoryRepository Categories { get; private set; }
public IPhotoRepository Photos { get; private set; }

public UnitOfWork(ApplicationDbContext context, IProductRepository productRepository,
ICategoryRepository categoryRepository, IPhotoRepository photoRepository)
{
_context = context;
Products = productRepository;
Categories = categoryRepository;
Photos = photoRepository;
}

public int Complete()
{
return _context.SaveChanges();
}

public Task<int> CompleteAsync()
{
return _context.SaveChangesAsync();
}

public void Dispose()
{
_context.Dispose();
}

public async ValueTask DisposeAsync()
{
await _context.DisposeAsync();
}
}

使用这样的接口(interface):
public interface IUnitOfWork : IDisposable, IAsyncDisposable
{
IProductRepository Products { get; }
ICategoryRepository Categories { get; }
IPhotoRepository Photos { get; }
int Complete();
Task<int> CompleteAsync();
}

同时拥有 Async 和 Sync 方法是否正确?例如,如果我在 asp net core 中使用 DI,那么在处理过程中将调用什么方法。

最佳答案

何时应该只实现 IDisposable ? IDispoable是更标准和默认的接口(interface),从一开始或之后几乎所有框架都支持。如果你的类或你的类的派生类不需要异步释放资源,那么考虑只实现IDisposable .例如,SemaphoreSlim未实现 IAsyncDisposable .
什么时候可以只实现 IAsyncDisposable ?
注意:这更适用于您可以控制或知道如何实例化和销毁对象的情况。例如,如果您正在编写一个可执行文件(而不是库),您可以在其中更好地控制您的整体环境和代码的命运。
你应该执行 IAsyncDisposable如果您预见到您的类或您的类的派生类将需要或可能需要异步释放资源。
什么时候应该同时实现 IAsyncDisposableIDisposable ?
注意:下面更多地适用于库的最佳实践和推荐方法,因为它们通常无法控制创建库中定义的类型实例的代码。
理想情况下,您应该同时实现 IAsyncDisposableIDisposable .换句话说,IAsyncDisposable不应被视为 IDisposable 的替代品.
为什么?

  • 依赖注入(inject)框架可能支持也可能不支持 IAsyncDisposable .大多数,当然,但不是所有的依赖注入(inject)系统都是一样的。如果你正在编写一个库,你不知道你的对象将如何被创建。
  • 如果您的代码在容器内运行并且容器被同步处理,则可能会引发异常(对于 .NET Core 依赖注入(inject)系统来说是这样)。
  • 创建一个对象然后在 DisposeAsync 上阻塞并不那么干净。使其同步。调用者的 dispose 调用将更像 yourDisposableObject.DisposeAsync().GetAwaiter().GetResult() .

  • 这是来自微软官方 MSDN 的引述.

    It is typical when implementing the IAsyncDisposable interface that classes will also implement the IDisposable interface. A good implementation pattern of the IAsyncDisposable interface is to be prepared for either synchronous or asynchronous dispose. All of the guidance for implementing the dispose pattern also applies to the asynchronous implementation.


    其他次要建议:考虑实现您的 Dispose()DisposeAsync()如果您预见到您的类的派生类将具有可能需要处理的资源,则为虚拟。否则,请考虑让您的类(class) sealed .
    好例子
  • Stephen Toub's Binary Writer class

  • 引用文献
  • Alistair Evans blog
  • MSDN
  • Code Therapist
  • 关于c# - 类应该同时实现 IAsyncDisposable 和 IDisposable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62074767/

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