C# 在N层数据应用程序中使用异步
我当前使用的应用程序不支持异步执行。 我的目标是使一个三层n层同步应用程序支持异步调用 WebC# 在N层数据应用程序中使用异步,c#,entity-framework,asynchronous,async-await,n-tier-architecture,C#,Entity Framework,Asynchronous,Async Await,N Tier Architecture,我当前使用的应用程序不支持异步执行。 我的目标是使一个三层n层同步应用程序支持异步调用 Web [HttpPost("GetOrganisations")] public OrganisationViewModel GetOrganisations([FromBody] GetOrganisationModel model) { List<OrganisationModel> organisations = _organisationService.GetOrganisati
[HttpPost("GetOrganisations")]
public OrganisationViewModel GetOrganisations([FromBody] GetOrganisationModel model)
{
List<OrganisationModel> organisations = _organisationService.GetOrganisations(model?.Id, model?.StatusIds).ToList();
return new OrganisationViewModel()
{
Organisations = organisations
};
}
[HttpPost(“GetOrganizations”)]
公共组织视图模型GetOrganizations([FromBody]GetOrganizationModel模型)
{
列出组织=_OrganizationService.getOrganizations(model?.Id,model?.StatusIds).ToList();
返回新组织视图模型()
{
组织=组织
};
}
业务
public IEnumerable<OrganisationModel> GetOrganisations(int? organisationId, List<int> statusIds)
{
return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel()); //ToModel = Remapping to business model using extension
}
public static class OrganisationExtensions
{
public static OrganisationEntity ToEntity(this OrganisationModel model)
{
if (model == null) return null;
OrganisationEntity entity = Mapper.Map<OrganisationModel, OrganisationEntity>(model);
return entity;
}
public static OrganisationModel ToModel(this OrganisationEntity entity)
{
if (entity == null) return null;
OrganisationModel model = Mapper.Map<OrganisationEntity, OrganisationModel>(entity);
model.StatusName = entity?.Status?.Name;
return model;
}
}
public Task<IEnumerable<OrganisationModel>> GetOrganisations(int? organisationId, List<int> statusIds)
{
return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel());
}
public IEnumerable GetOrganizations(int?OrganizationID,列表状态ID)
{
返回_OrganizationRepository.getOrganizations(OrganizationID,StatusID)。选择(m=>m.ToModel());//ToModel=使用扩展重新映射到业务模型
}
公共静态类组织扩展
{
公共静态组织实体到实体(此组织模型)
{
if(model==null)返回null;
OrganizationEntity=Mapper.Map(模型);
返回实体;
}
公共静态组织模型ToModel(该组织实体)
{
if(entity==null)返回null;
OrganizationModel=Mapper.Map(实体);
model.StatusName=实体?.Status?.Name;
收益模型;
}
}
数据
public IEnumerable<OrganisationEntity> GetOrganisations(int? organisationId, List<int> statusIds)
{
IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();
if (organisationId != null && organisationId > 0)
{
organisations = organisations.Where(o => o.Id == organisationId);
}
if (statusIds != null && statusIds.Count > 0)
{
organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
}
return organisations;
}
public async Task<List<OrganisationEntity>> GetOrganisations(int? organisationId, List<int> statusIds)
{
IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();
if (organisationId != null && organisationId > 0)
{
organisations = organisations.Where(o => o.Id == organisationId);
}
if (statusIds != null && statusIds.Count > 0)
{
organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
}
return await organisations.ToListAsync();
}
public IEnumerable GetOrganizations(int?OrganizationID,列表状态ID)
{
IQueryable Organizations=DB.organization.Include(“Status”).OrderByDescending(d=>d.Created).AsQueryable();
如果(OrganizationID!=null&&OrganizationID>0)
{
组织=组织。其中(o=>o.Id==组织Id);
}
if(statusIds!=null&&statusIds.Count>0)
{
Organizations=Organizations.Where(o=>StatusId.Contains(o.StatusId));
}
返回组织;
}
如何使此代码异步?
业务层中的映射扩展使这变得越来越困难
是否有必要一直“冒泡”异步/等待调用
让我试一试。。
数据
public IEnumerable<OrganisationEntity> GetOrganisations(int? organisationId, List<int> statusIds)
{
IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();
if (organisationId != null && organisationId > 0)
{
organisations = organisations.Where(o => o.Id == organisationId);
}
if (statusIds != null && statusIds.Count > 0)
{
organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
}
return organisations;
}
public async Task<List<OrganisationEntity>> GetOrganisations(int? organisationId, List<int> statusIds)
{
IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();
if (organisationId != null && organisationId > 0)
{
organisations = organisations.Where(o => o.Id == organisationId);
}
if (statusIds != null && statusIds.Count > 0)
{
organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
}
return await organisations.ToListAsync();
}
公共异步任务GetOrganizations(int?OrganizationID,列表状态ID)
{
IQueryable Organizations=DB.organization.Include(“Status”).OrderByDescending(d=>d.Created).AsQueryable();
如果(OrganizationID!=null&&OrganizationID>0)
{
组织=组织。其中(o=>o.Id==组织Id);
}
if(statusIds!=null&&statusIds.Count>0)
{
Organizations=Organizations.Where(o=>StatusId.Contains(o.StatusId));
}
返回等待组织。ToListSync();
}
业务
public IEnumerable<OrganisationModel> GetOrganisations(int? organisationId, List<int> statusIds)
{
return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel()); //ToModel = Remapping to business model using extension
}
public static class OrganisationExtensions
{
public static OrganisationEntity ToEntity(this OrganisationModel model)
{
if (model == null) return null;
OrganisationEntity entity = Mapper.Map<OrganisationModel, OrganisationEntity>(model);
return entity;
}
public static OrganisationModel ToModel(this OrganisationEntity entity)
{
if (entity == null) return null;
OrganisationModel model = Mapper.Map<OrganisationEntity, OrganisationModel>(entity);
model.StatusName = entity?.Status?.Name;
return model;
}
}
public Task<IEnumerable<OrganisationModel>> GetOrganisations(int? organisationId, List<int> statusIds)
{
return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel());
}
公共任务组织(int?组织ID,列表状态ID)
{
return _OrganizationRepository.getOrganizations(OrganizationID,StatusID)。选择(m=>m.ToModel());
}
“Task>”不包含“Select”的定义,并且找不到接受“Task>”类型的第一个参数的扩展方法“Select”
我知道我可以很容易地在业务层等待结果,但这不是使用异步的错误方法吗?据我所知,我应该在weblayer等待结果,并在使用async时以某种方式将数据模型映射到业务模型。async确实需要全部或全部才能有效。如果您在调用堆栈的任何位置都有一个阻塞调用,那么您的可伸缩性或多或少会降低 就实体框架而言,让您的数据层直接返回
IQueryable
,而不是返回列表可能会很有用。这可以让你灵活地升级你的应用程序,而不是一次全部升级
公共任务组织(int?组织ID,列表状态ID)
{
返回(wait_organizationrepository.getorganizations(organizationid,statusid))。选择(m=>m.ToModel());
}
[HttpGet]
公共异步任务GetOrganizations(int?OrganizationID,[FromUri]int[]StatusID)
{
返回OK(等待_businessObject.getOrganizations(OrganizationID,StatusID));
}
是否有必要一直“冒泡”异步/等待调用。是的,只要您使用
.Wait()
或.Result
剪切某个位置,该方法仍将阻塞。如果您有异步操作,请使用异步。这些操作真的是异步的吗?或者是封锁行动?您的ORM支持异步吗@Gonzalo.-返回等待组织。ToListSync();在您的业务代码中,您需要等待return await\u organizationrepository.getorganizations(Organism…
@Niraj)-但这会阻止我向调用者发送异步消息,我不应该在webapi上等待结果吗?如果我不“冒泡”,它是否会失去“意思”异步到调用方?正如其他人回答的那样。您需要一直等到webapi层。更新了答案。因此,通过在我的业务层中使用wait,我还可以进行同步?如果在web api中有更多类似这样的数据库调用,我仍然需要等待业务层中的每个请求?wait和和同步调用。同步调用会阻止线程在那里等待,而等待线程可以自由执行其他任务。我建议您参考Ok。在我接受您的回答之前,还有最后一个问题。您认为这种代码设计不适合异步调用吗?您会采取不同的做法吗?我的意思是,这种设计会导致cks?阻止任何行动?谢谢