实现内存中数据列表的异步接口



我目前正在将同步实现更改为异步实现。我已经更新并定义了以下接口:

public interface IMGP1DFC
{
// get all
Task<IEnumerable<MGP1DFC>> GetAllAsync();
// get single
Task<MGP1DFC> GetSingleAsync(int id);
// add
void Add(MGP1DFC mgp1dfc);
// update
void Update(MGP1DFC mgp1dfc);
// delete
void Delete(MGP1DFC mgp1dfc);
// save
Task SaveAsync();
}

我使用此接口实现和定义了一个服务,该服务连接到如下数据库:

public class MGP1DFCData : IMGP1DFC
{
private ApplicationDbContext _applicationDbContext;
//
public MGP1DFCData(ApplicationDbContext applicationDbContext) {
_applicationDbContext = applicationDbContext;
}
public void Add(MGP1DFC mgp1dfc)
{
_applicationDbContext.Add(mgp1dfc);
}
public void Delete(MGP1DFC mgp1dfc)
{
_applicationDbContext.Remove(mgp1dfc);
}
public async Task<IEnumerable<MGP1DFC>> GetAllAsync()
{
return await _applicationDbContext.MGP1DFC.OrderBy(x => x.ReceivedByDateTime).ToListAsync();
}
public async Task<MGP1DFC> GetSingleAsync(int id)
{
return await _applicationDbContext.MGP1DFC.FirstOrDefaultAsync(x => x.Id == id);
}
public async Task SaveAsync()
{
await _applicationDbContext.SaveChangesAsync();
}
public void Update(MGP1DFC mgp1dfc)
{
_applicationDbContext.Update(mgp1dfc);
}
}

没问题。

但是,这里以前有一个内存中服务:

public class MGP1DFCInMemory : IMGP1DFC
{
List<MGP1DFC> MGP1DFCs;
public MGP1DFCInMemory()
{
MGP1DFCs = new List<MGP1DFC> {
new MGP1DFC { Id = 1, Name = "DS", Nino = "DS123123D", SentByName = "Bobbleton", SentByEmail = "Bobbleton@ds.com.uk.net", ReceivedByDateTime = DateTime.Now},
new MGP1DFC { Id = 2, Name = "Kenneth", Nino = "FG123123D", SentByName = "Pattie", SentByEmail = "pattie@ds.com.uk.net", ReceivedByDateTime = DateTime.Now.AddHours(6)},
new MGP1DFC { Id = 3, Name = "Bob", Nino = "DS123123D", SentByName = "The Chieftain", SentByEmail = "cheiftain@ds.com.uk.net", ReceivedByDateTime = DateTime.Now.AddMinutes(904)}
};
}
public void Add(MGP1DFC MGP1DFC)
{
MGP1DFC.Id = MGP1DFCs.Max(index => index.Id) + 1;
MGP1DFCs.Add(MGP1DFC);
}
public void Delete(MGP1DFC MGP1DFC)
{
MGP1DFCs.Remove(MGP1DFC);
}
public IEnumerable<MGP1DFC> GetAll()
{
return MGP1DFCs.OrderBy(x => x.ReceivedByDateTime);
}
public MGP1DFC GetSingle(int id)
{
return MGP1DFCs.FirstOrDefault(x => x.Id == id);
}
public MGP1DFC Update(MGP1DFC category)
{
MGP1DFC formToUpdate = MGP1DFCs.FirstOrDefault(i => i.Id == category.Id);
formToUpdate.CompletedByDateTime = DateTime.Now;
formToUpdate.CompletedByEmail = "ds@ds.com";
formToUpdate.CompletedBy = "DS";
return formToUpdate;
}
}

是否可以实现异步内存中服务?

例如

public async Task<IEnumerable<MGP1DFC>> GetAllAsync()
{
return await MGP1DFCs.OrderBy(x => x.ReceivedByDateTime).ToListAsync();
}

或者这完全是浪费时间,尝试!?

如果你只需要让这个类简单地实现接口,那么你可以使用Task.FromResult编写这个接口的同步实现。这将创建已完成的任务,并且所有操作都是同步完成的。

public Task<IEnumerable<MGP1DFC>> GetAllAsync()
{
return Task.FromResult(MGP1DFCs);
}
public Task<MGP1DFC> GetSingleAsync(int id)
{
return Task.FromResult(MGP1DFCs.FirstOrDefault(x => x.Id == id));
}
public async Task SaveAsync()
{
// Not much to do here...
return Task.CompletedTask;
} 

"内存中服务"没有任何异步,假设它 - 顾名思义 - 仅对内存中数据执行 CPU 密集型工作。

为实际上同步的方法提供异步包装器通常被认为是一种代码异味。请参阅@Stephen Cleary的博客文章以获取更多信息。

编辑:如果"内存中服务"只是与数据库通信的真正异步服务的某种存根,并且您只是希望它实现与"真实"服务相同的接口,则可以使用Task.FromResult方法返回已完成的任务,如@FCin建议的那样。如果"内存中服务"是其他东西,那么实现"异步"接口就没有多大意义了。

最新更新