0

我有一个消息服务,其中包含创建、列出、更新和删除等操作。

在此服务中,我有一个 ListByMember(int memberId) 方法。

我需要构建两个视图,一个仅列出消息的标题,另一个视图列出消息的标题和描述,另一个列出标题和已收到的消息答案的总数。

我不知道我是否在服务层中创建了一种方法并通过 DTO 将所有信息从消息实体传输到视图中,并且在视图中我只显示我想要的字段,或者我是否在服务层中创建了三种方法独立于它自己的 DTO 和特定视图。

我害怕创建一个单一的服务方法,如果将来我需要一个特殊的消息列表,我将面临一个问题。

任何建议都会很好。

谢谢。

4

2 回答 2

1

视图/控制器操作不是放置业务逻辑的最佳位置。尝试在服务中使用三种方法,即使这意味着一些额外的代码。您已决定使用 DTO 来实现非常好的项目。您可以采取的一种方法是创建一个私有方法以从存储库中将 DTO 获取为 IQueryable 并通过公共方法公开它作为示例

// DTOs
public class MessageSummaryADto
{
    public int MessageId { get; set; }
    public string Title { get; set; }
}

public class MessageSummaryBDto : MessageSummaryADto
{
    public string Description { get; set; }
}

// public methods
public int GetMessageCount()
{
    return GetMessageSummary().Count();
}

public IQueryable<MessageSummaryADto> GetMessageSummaryADto()
{
    return GetMessageSummary().Select(m => new MessageSummaryADto { MessageId = m.MessageId, Title = m.Title });
}

public IQueryable<MessageSummaryBDto> GetMessageSummaryBDto()
{
    return GetMessageSummary();
}

// the private method
private IQueryable<MessageSummaryBDto> GetMessageSummary()
{
    return yourMessageRepository.Select(m =>
        new MessageSummaryBDto {
            MessageId = m.MessageId,
            Title = m.Title,
            Description = m.Description
        }
    );
}

如果您不是 IQueryable 的粉丝,您可以将 dto 公开为 IList

祝你好运

于 2013-03-09T02:55:10.993 回答
0

我的第二个答案需要两个级别的服务,一个业务服务和一个 UI 服务。如果您有非常具体的 UI 处理(例如列表和网格等的投影和过滤器),您会希望使用这种方法。业务服务将公开更多通用方法,这对 UI 来说是中性的

那么它是如何映射的;

域对象(输出:业务对象)-> 业务服务(输出通用 DTO)-> UI 服务(特定于 UI 的 DTO)-> 控制器操作-> 视图

将数据切片和切块的 UI 任务卸载到特定于 UI 的服务使 Controller Action 非常薄(应该如此);通常,如果您可以将控制器操作中的代码行数限制为 10~15

将 UI 服务与代码业务服务分开将使您可以轻松拥有多个 UI。例如,当您的业务服务是 UI 中立时,您可以使用它来处理 ASP.Mvc 和 WPF 应用程序

上述方法需要维护额外的层,但如果您想要清晰的分离,值得考虑

干杯

于 2013-03-11T00:17:46.223 回答