模型中有方法不好吗?

Is it bad to have methods in a model?

在 ASP.NET MVC 中,我正在考虑实现一种将数据转换为 JSON 的方法。但是,我不确定在哪里添加此方法。我应该将它添加到 Controller、service class 还是 Model 中?因此,例如,假设我有一个名为 book 的模型和一个名为 Library 的控制器。

public class Book
{
    public string Name { get; set; }
    public string Json { get; set; }
}

public class Library: Controller
{
    public ActionResult Book(string bookName)
    {
        return View();
    }
}

是否应该在Book class中添加一个私有方法,如JsonConverter(object jsonToConvert),并在Book的构造函数中调用它?因此,用户将要转换的对象传递给 Book class,然后在实例化时将其转换为 Json 并分配给 Book.Json.

在模型中添加方法是一种不好的做法吗?添加具有 JsonConverter 的服务 class 并在控制器中进行转换是否更好?

所以,喜欢

public class Library: Controller
{
    public ActionResult Book(string bookName)
    {
        var book = GetBook(bookName)
        var json = Service.ConvertJson(book.object)
        return View(book, json);
    }
}

总结一下我的问题:在模型中添加私有方法并操作数据格式是不好的做法吗?我不想在控制器中进行转换的原因是我认为将数据格式转换为 class 是一种不好的做法,因为数据层是模型。我错了吗?

思想是保持层次之间相互抽象,牢记Single-Responsibility原则,一个class应该做一件事,做好一件事。

在这方面,您的模型负责定义数据模式。模型的实例将保存数据。就是这样。

这就是你的模型

public class Book
{
  public string Name {get; set;}
  public string Json {get; set;}
}

在这种情况下,输出一个 Book 的实例是一个端点问题。它与涉及您的服务的业务逻辑无关。

所以将它保存在控制器中

public class Library: Controller
{
  public ActionResult Book(string bookName)
  {
    var book = GetBook(bookName)
    var json = Service.ConvertJson(book.object)
    return View(book, json);
  }
}

是你最擅长的。

每当你试图取得成就时问问自己:这应该由谁负责?

  • 管理员:把这想象成迎接你的服务员,带你到你的 table 并在餐厅为你点菜。
  • 服务:这是给你做饭的厨师。
  • 模特:这是您要在菜单中点的餐点。

转换为 JSON 与服务相关,因此该责任由控制器承担。