在视图中编写也可以在控制器/业务中编写的C#代码对性能有何影响?
我这样做是为了避免在业务类中出现额外的视图模型映射。 例如:在视图中编写也可以在控制器/业务中编写的C#代码对性能有何影响?,c#,asp.net-mvc,razor,view,C#,Asp.net Mvc,Razor,View,我这样做是为了避免在业务类中出现额外的视图模型映射。 例如: public class PatientInfoBusiness { public List<PatientInfo> GetPatientInfo() { IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy(); var piData= proxy.GetPatientInfoSect
public class PatientInfoBusiness
{
public List<PatientInfo> GetPatientInfo()
{
IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy();
var piData= proxy.GetPatientInfoSectionData();
//var patientInfoVM= new List<patientInfoVM>();
//piData.ForEach( a => patientInfoVM.Add(
// new patientInfoVM
// {
// AcknowledgedUserName = a.AcknowledgedUserName,
// Description = a.Description,
// PriorityCode = a.PriorityCode,
// Status = a.Status
// }
// )
// );
return piData;
}
}
公共类业务
{
公共列表GetPatientInfo()
{
iPatientInfo服务代理=新的VRFactory().GetPatientInfoServiceProxy();
var piData=proxy.GetPatientInfoSectionData();
//var patientInfoVM=新列表();
//ForEach(a=>patientInfoVM.Add(
//新的PatientFoVM
// {
//AcknowledgedUserName=a.AcknowledgedUserName,
//描述,
//优先级代码=a.PriorityCode,
//状态
// }
// )
// );
返回piData;
}
}
将上述业务中的注释代码转换为查看、循环并以HTML显示。这样就不需要patientInfoVM视图模型但是我完全跳过了业务层,直接从视图中的服务层绑定实体我不认为这里不应该存在可维护性与性能的问题。都是关于时间的。开发/阅读/修改解决方案所需的时间越短越好。因此,您需要将解决方案分层。如果数据层发生了变化,您不必修改gui层。 不应进行预优化。但是有一些技巧可以让你的代码更有效 您可以返回一个
IEnumerable
。这将创建patientInfoVM
lazy这将仅在迭代时创建项目。
public class PatientInfoBusiness
{
public IEnumerable<PatientInfo> GetPatientInfo()
{
IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy();
var piData= proxy.GetPatientInfoSectionData();
return piData.Select(a => new patientInfoVM
{
AcknowledgedUserName = a.AcknowledgedUserName,
Description = a.Description,
PriorityCode = a.PriorityCode,
Status = a.Status
});
}
}
但如果需要使用多个结果,则应保留以下项目:
var patientInfoList = GetPatientInfo().ToArray();
foreach(var patientInfo in patientInfoList)
{
// do something.
}
foreach(var patientInfo in patientInfoList)
{
// do something.
}
我不认为这里的问题不应该是维护性与性能的对比。都是关于时间的。开发/阅读/修改解决方案所需的时间越短越好。因此,您需要将解决方案分层。如果数据层发生了变化,您不必修改gui层。 不应进行预优化。但是有一些技巧可以让你的代码更有效 您可以返回一个
IEnumerable
。这将创建patientInfoVM
lazy这将仅在迭代时创建项目。
public class PatientInfoBusiness
{
public IEnumerable<PatientInfo> GetPatientInfo()
{
IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy();
var piData= proxy.GetPatientInfoSectionData();
return piData.Select(a => new patientInfoVM
{
AcknowledgedUserName = a.AcknowledgedUserName,
Description = a.Description,
PriorityCode = a.PriorityCode,
Status = a.Status
});
}
}
但如果需要使用多个结果,则应保留以下项目:
var patientInfoList = GetPatientInfo().ToArray();
foreach(var patientInfo in patientInfoList)
{
// do something.
}
foreach(var patientInfo in patientInfoList)
{
// do something.
}
如果没有任何硬指标,我只能提供我的意见,但它代替了其他更多分析驱动的回答 我会说,是,将业务逻辑放在单独的层中会导致稍微增加开销,从而降低性能。我还想说,如果我用原始机器代码编写代码,我可以压缩更多的性能,但那太疯狂了。因此,以下是我认为性能稍差的原因:
- 在整个视图中混合数据访问代码的维护将成为一场噩梦——最终将多次重新编写相同的访问样板代码(因为您不能在其他视图中重用查询逻辑)
- 视图通常是JIT编译的(除非您关闭它),并且intellisense通常不能完全跟上您正在做的事情,因此您可能会将编译时错误泄漏到运行时
- 通过视图进行调试很糟糕——确实如此
- 将表示代码和业务逻辑混合在一起通常是一个“坏主意”——主要是因为这两个问题变得过于混杂
- 在您的示例中,您使用的是一个
,这是一个性能较低的便利结构:所以这没关系,为什么不使用MVC呢李>列表
- 如何在视图中处理错误?您是否捕获异常并输出不同的标记?如何将其转换为显示模板、局部视图和其他类似的内容
总之,这就是我的全部观点:问问自己为什么要使用这个框架,以及最后一次性能下降可能会在其他方面给你带来什么损失。但是决定取决于你。没有任何硬性指标,我只能提供我的意见,但它代替了其他更多分析驱动的回答 我会说,是,将业务逻辑放在单独的层中会导致稍微增加开销,从而降低性能。我还想说,如果我用原始机器代码编写代码,我可以压缩更多的性能,但那太疯狂了。因此,以下是我认为性能稍差的原因:
- 在整个视图中混合数据访问代码的维护将成为一场噩梦——最终将多次重新编写相同的访问样板代码(因为您不能在其他视图中重用查询逻辑)
- 视图通常是JIT编译的(除非您关闭它),并且intellisense通常不能完全跟上您正在做的事情,因此您可能会将编译时错误泄漏到运行时
- 通过视图进行调试很糟糕——确实如此
- 将表示代码和业务逻辑混合在一起通常是一个“坏主意”——主要是因为这两个问题变得过于混杂
- 在您的示例中,您使用的是一个
,这是一个性能较低的便利结构:所以这没关系,为什么不使用MVC呢李>列表
- 如何在视图中处理错误?您是否捕获异常并输出不同的标记