服务层中的 JsonResult
Posted
技术标签:
【中文标题】服务层中的 JsonResult【英文标题】:JsonResult in services layer 【发布时间】:2012-01-30 10:29:37 【问题描述】:在我的 MVC3 解决方案中,我想知道如何将返回 Json 的逻辑移出控制器并进入服务层。假设我在控制器中有以下操作来获取 JQueryUI 自动完成控件所需的 Json:
public JsonResult ClientAutocompleteJSON(string term)
NorthwindEntities db = new NorthwindEntities();
var customers = db.Customers
.Where(c => c.ContactName.Contains(term))
.Take(25)
.Select(c => new
id = c.CustomerID,
label = c.ContactName,
value = c.ContactName
);
return Json(customers, JsonRequestBehavior.AllowGet);
如何将其移至服务层?我不想在我的服务层中引用 System.Web.MVC。我也想过返回客户,但我不确定如何返回匿名类型 - 我必须创建一个类吗?
【问题讨论】:
关于返回客户 - 您不能返回匿名类型,并且确实需要一个类。 【参考方案1】:我不会将您的服务实现与特定 (UI) 格式结合起来。最好返回一个强类型的客户对象,然后在您的 Action 方法中按照您的需要对其进行格式化。
// Service method
public IEnumerable<Customer> FindCustomers(string term)
NorthwindEntities db = new NorthwindEntities();
return db.Customers
.Where(c => c.ContactName.Contains(term))
.Take(25)
.ToList();
// Action method
public JsonResult ClientAutocompleteJSON(string term)
var customers = customerService.FindCustomers(term)
.Select(c => new
id = c.CustomerID,
label = c.ContactName,
value = c.ContactName
);
return Json(customers, JsonRequestBehavior.AllowGet);
此代码可重用性更高 - 例如,您可以使用相同的服务方法来提供简单的 html 搜索表单。
【讨论】:
【参考方案2】:创建一个 DTO 对象:http://martinfowler.com/eaaCatalog/dataTransferObject.html
【讨论】:
【参考方案3】:我知道 Ruby on Rails 中的一个功能,您可以在其中定义您的方法能够根据客户端偏好返回 JSON 或 XML 或 HTML,如果您能找到一个可以执行此操作的库,这将是一个很好的功能为你。这可能是通过动态代理您的服务可以做到的一个方面。
【讨论】:
以上是关于服务层中的 JsonResult的主要内容,如果未能解决你的问题,请参考以下文章