假设您正在实现自己的 stackoverflow 版本(再次,是的)
您的服务提供了所有必需的功能,如下所示:
class Question { ... } // EF entity
class Answer { ... } // EF entity
interface IStackoverflowService
{
void PostQuestion(Question question);
void PostAnswer(Answer answer);
void UpdateQuestion(Question question);
...
}
这似乎很简单,通常我认为这是一个好主意。我在这里唯一不喜欢的是客户端代码(ASP.NET MVC 控制器)可以直接访问Question
s 和Answer
s。假装我们有一些与发布问题和答案有关的强硬 BL。将这个逻辑集中在一个“单一的地方”——在服务层上是个好主意。如果您的客户端代码可以访问Question
s,那么有一天有人可能会决定向您的一个控制器添加“只是一点点逻辑”,这基本上是个坏主意。
我正在考虑定义一些 DTO,它们将成为服务接口的一部分,因此客户端代码将只能使用这些包含“恰到好处的细节”的 DTO。
假设您的问题实体定义如下:
interface Question
{
int Id { get; set; }
User Poster { get; set; }
DateTime Posted { get; set; }
DateTime? Edited { get; set; }
string Title { get; set; }
string Text { get; set; }
IQueryable<Answer> Answers { get; set; }
...
}
发布问题时,请求应仅包含Title
,Text
和Poster
。所以,我将定义一个PostQuestionDTO
:
class PostQuestionDTO
{
User Poster { get; set; }
string Title { get; set; }
string Text { get; set; }
}
当有人打开页面检查问题时,会有更多详细信息,例如Posted
和Edited
:
class QuestionDetailsDTO
{
User Poster { get; set; }
string Title { get; set; }
string Text { get; set; }
DateTime Posted { get; set; }
DateTime? Edited { get; set; }
}
等等。这是一个好的做法还是你认为它过度设计?这里的常用方法是什么?