我有一个消息服务,其中包含创建,列表,更新和删除等操作。
在本服务中,我有一个ListByMember(int memberId)方法。
我需要构建两个视图,一个列出仅包含消息标题,另一个视图列出标题和消息描述,另一个列出标题和已收到的消息答案总数
我不知道我是否在服务层创建了一个方法,并通过DTO将所有信息从消息实体传输到View,在View中我只显示了我想要的字段,或者我是否创建了三个方法服务层与其自己的DTO和特定的视图独立。
我害怕创建一个单一的服务方法,如果将来我需要一个特殊的消息列表,我将面临一个问题。
任何建议都会很好。
感谢。
答案 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应用程序
以上方法需要维持额外层数的价格,但如果您想要明确分离,则值得考虑
干杯