【问题标题】:Service layer returning only models服务层仅返回模型
【发布时间】:2014-05-12 17:37:31
【问题描述】:

服务层应该只返回模型对象吗?网上有一些关于它的帖子(herehere 是一些 SO 帖子),但没有一个很好的例子。

我看到的都是这样的:

服务应该只关心问题域,而不是视图 呈现结果。返回值应该用域来表示 对象,而不是视图。

我觉得我在这里遗漏了一些东西。

看下面的例子......假设我想返回所有电影的列表,但是,我需要一个 boolean 标志 - 类似于 hasLike - 以显示我之前是否已经喜欢它。怎么可能只从服务层返回模型?

简而言之......我如何按照这种方法从服务层返回meta information?这可能吗?

型号

public class Person
{
    public int                     PersonID        { get; set; }
    public string                  Name            { get; set; }
    public ICollection<Movie>      FavoriteMovies  { get; set; }
    public ICollection<MovieLikes> Likes           { get; set; }
}

public class Movie
{
    public int      MovieID     { get; set; }
    public string   Name        { get; set; }
    public string   Description { get; set; }
}

public class MovieLike
{
    public int              MovieLikeID      { get; set; }
    public int              PersonID         { get; set; }
    public int              MovieID          { get; set; }
    public DateTimeOffset   Date             { get; set; }
}

服务

public class MovieService : IMovieService
{
    public Movie Get(int id)
    {

    }

    public Movie GetByName(string name)
    {

    }

    public IEnumerable<Movie> GetAll()
    {
        return unit.DbSet<Movie>();
    }
}

【问题讨论】:

标签: c# asp.net-mvc viewmodel service-layer


【解决方案1】:

您可以将服务拆分为查询和命令。

查询操作返回您的数据的扁平化非规范化视图,您的客户可以轻松使用这些视图。命令操作接受只包含执行命令所需信息的命令。

这意味着您从服务返回的查询模型与数据库中的不同。您可以根据需要添加属性,例如,HasLike 属性由在您的服务(或最好是业务层)中执行的某些业务逻辑设置。因此,如果对客户没有附加价值,您不必返回喜欢的列表;但是根据是否有喜欢将HasLikes 设置为true 或false。

基本上,您在示例中提供的模型类(Person、Movie、MovieLike)代表了它们在您的域和/或数据库中的外观;但不是那些从您的服务中返回的人。相反,您可以:

 public IEnumerable<MovieSummary> GetAll()
 {
     return unit.DbSet<Movie>();
 }

 // All properties needed in summarized representation
 public class MovieSummary
 {
     public int MovieID { get; set; }
     public string   Name { get; set; }
     public string   Description { get; set; }
     public bool HasLike { get; set; }
     // Other calculated properties
 }

还有……

 public MovieDetails Get(int id)
 {

 }

 // All properties needed in detailled representation
 public class MovieDetails
 {
     public int MovieID { get; set; }
     public string   Name { get; set; }
     public string   Description { get; set; }
     public ICollection<MovieLikes> Likes { get; set; }
     // more
 } 

以最佳方式设计您的服务合同以供您的客户使用,让您的生活更轻松。

【讨论】:

  • 那么,如果我做对了……不是只返回模型,而是说只返回 ViewModel?
  • 我不会真正返回视图模型,因为这些仅针对特定视图;服务操作可以返回可用于我的多个客户端/视图的模型。但是让它成为一个扁平化的视图而不是数据的层次结构,只返回需要的内容,如果需要的话,可以添加 HasLikes 之类的概念。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2012-08-30
  • 2011-03-01
  • 1970-01-01
  • 2011-08-21
  • 2019-06-16
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多