服务和控制器方法类似操作

时间:2013-03-08 18:04:38

标签: asp.net-mvc

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

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

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

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

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

任何建议都会很好。

感谢。

2 个答案:

答案 0 :(得分: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的粉丝,可以将dtos公开为IList

祝你好运

答案 1 :(得分:0)

我的第二个答案保证提供两种级别的服务,即业务服务和UI服务。如果您具有非常特定的UI处理(例如列表和网格等事物的投影和过滤器),您可能希望采用这种方法。业务服务将公开更多通用方法,这对UI来说是中立的

所以如何映射;

域对象(输出:Business Objects ) - &gt;商业服务(输出通用DTO ) - &gt; UI服务( UI特定DTO ) - &gt;控制器动作 - &gt;图

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

,那将是一件好事

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

以上方法需要维持额外层数的价格,但如果您想要明确分离,则值得考虑

干杯