2013-03-08 54 views
0

我有一個消息服務,具有創建,列表,更新和刪除操作。服務和控制器方法類似的操作

在這項服務中,我有一個ListByMember(int memberId)方法。

我需要建立兩個視圖,一個只列出消息的標題,另一個視圖列出標題和消息的描述,另一個列出標題和消息答案的總數接收。

我不知道我是否在服務層中創建了一個方法,並通過DTO傳輸了從消息實體到視圖和視圖中的所有信息。我只顯示了我想要的字段,或者如果我創建了三個方法在服務層獨立於它自己的DTO和特定的視圖。

我害怕創建一個單一的服務方法,如果將來我需要一個特殊的消息列表,我將面臨一個問題。

任何建議都會很好。

謝謝。

回答

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的

好運

+0

謝謝你好,所以你的每一個DTO我的意見有一個Service Public方法返回這個DTO類型?另一個問題btw,如果你有一個需要另一個實體的數據的ViewModel,比如說在博客的博客評論中,你是否創建了一個本地類,其中包含你在本地視圖模型中只需要的評論的詳細信息,並構建一個列表評論服務方法,或者使用使用coments服務方法執行列表的coments viewmodel?我認爲如果我需要專業領域,使用外部評估類可能會限制未來的變化。提前致謝。 – Patrick 2013-03-09 15:58:01

+0

嗨,如果只需要在視圖中隔離博客評論的概念,我會在UI層創建一個DTO,然後使用一個服務,該服務將返回一個IQueryable 以在控制器操作中對其進行投影。如果你有一個獨立的用戶界面服務層,那麼你需要將模型從用戶界面移動到用戶界面服務層,並在那裏進行投影。我很想發佈一個代碼片段來描述這個概念,但如此評論提供了有限數量的字符 – 2013-03-10 01:47:05

+0

嗨,所以如果我明白你建議域 - >服務方法 - >地圖域到DTO - >控制器操作 - >將DTO映射到ViewModel - >查看每個「行」的行爲我有這條線,對嗎?您可以編輯您的答案,並根據需要填寫答案。謝謝 – Patrick 2013-03-10 23:55:29

0

我的第二個答案權證兩個層次的服務,業務服務和用戶界面的服務。如果您有非常特定的UI處理(例如列表和網格等投影和過濾器),您會希望採用這種方法。商業服務將會公開更多的通用方法,這對UI來說是中性的,因此它是如何映射的;

域對象(輸出:Business Objects公司) - >業務服務(輸出通用的DTO) - > UI服務(UI特定的DTO) - >控制器操作 - >查看

卸載將數據切片和劃分到UI特定服務的UI任務使得Controller Action非常簡單(應該是這樣)。一般情況下,如果您可以將控制器操作中的代碼行數限制爲10到15個,那麼將會很好。將UI服務與代碼業務服務分開將使您可以輕鬆擁有多個UI。例如,當您的業務服務與用戶界面無關時,您可以使用它來裝載到ASP。MVC和WPF應用程序

上述方法自帶的附加層,以維持價格,但如果你想有一個清晰的分離,這是值得考慮

乾杯

+0

嗨,謝謝,是的,但正如你所說,它會帶來成本。我認爲這裏的選項是每個DTO有1個服務方法。再次感謝 – Patrick 2013-03-11 09:45:58

相關問題