如何将此代码转换为服务模式?

时间:2018-01-03 08:47:34

标签: .net model-view-controller service

这是我的代码:

        [HttpGet]
    public ActionResult GetCategor(int catId)
    {
      using (uuEntities ems = new uuEntities())
      {
        return Json(ems.SupportSubCats.Where(x => x.CatID == catId).Select(
        x => new
        {
          SubId = x.SubCatID,
          SUbName = x.SubCatName
        }).ToList(), JsonRequestBehavior.AllowGet);
      }
    }

我尝试过:

在控制器中:

   [HttpGet]
    public ActionResult GetCategor(int catId)
    {
        return Json(_service.List(int catId), JsonRequestBehavior.AllowGet);
      }
    } 

在服务中:

    public void List(int catId)
    {
      return new GenericRepository<SupportSubCategory>(_factory.ContextFactory)
        .Get(filter: (x => x.CatID == catId))
        .Select(x => new
        {
          SubId = x.SubCatID,
          SUbName = x.SubCatName
        }).ToList();
    }

我认为我的退货类型不正确请告诉我解决方法。在公共空白附近,我收到一个错误,无效无法返回列表。

1 个答案:

答案 0 :(得分:1)

void方法不会向其调用方返回任何值。 您只能在return方法中使用空void来退出方法 - 但您无法返回任何值。

此代码完全有效并广泛用作常规做法:

public void DoSomething()
{
    if(<someCondition>)
    {
        return;
    }
    // The rest of the code will only be executed if <someCondition> evalualtes to false
}

通常,在将参数传递给方法时需要使用此模式,并且需要在实际执行方法的其余部分之前对其进行验证。

但是,此代码无效,无法编译

public void DoSomething()
{
    if(<someCondition>)
    {
        return false; // Here is your compiler error...
    }
    // The rest of the code will only be executed if <someCondition> evalualtes to false
}

在评论中进行对话之后,您应该创建一个类来保存Select的结果,而不是使用匿名类型,并从您的方法返回该类的列表:

// Note: I've renamed your method to something a little bit more meaningful
public List<SubDetails> ListSubDetails(int catId) 
{
  return new GenericRepository<SupportSubCategory>(_factory.ContextFactory)
    .Get(filter: (x => x.CatID == catId))
    .Select(x => new SubDetails()
    {
      SubId = x.SubCatID,
      SUbName = x.SubCatName
    }).ToList();
}

...

public class SubDetails
{
    public Int SubId {get; set;} // I'm guessing int here...
    public string SUbName {get; set;} // I'm guessing string here...
 }