在视图中编写也可以在控制器/业务中编写的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呢
  • 如何在视图中处理错误?您是否捕获异常并输出不同的标记