2

我已經構建了一個簡單的基於MVC3的票據入口網站的呼叫中心應用程序不太可用,並試圖重構我的原型,以更好地堅持設計模式部分使它更容易維護,但主要是作爲一種學習練習。 面向用戶的視圖是一個由基本用戶信息組成的表單,此外還有一些允許選擇各種資源類型的面板。每種資源類型(硬件,軟件等)都以同樣的方式顯示:使用帶有添加/刪除按鈕的雙重可過濾列表框,可選的「對齊」textarea,如果請求的資源需要證明,則可以有條件地顯示,以及一般註釋。 我建立以下視圖模型的各個面板:MVC3 - ViewModels和控制器功能:建議的設計模式

public class RequestableList 
{ 
    // list of requestable items ids requiring justification 
    private List<string> _restrictedItems = new List<string>(); 
    public List<string> RestrictedItems 
    { 
     get { return _restrictedItems; } 
     set { _restrictedItems = value; } 
    } 

    // the key-value pairs from which to populate available items list 
    private Dictionary<string, string> _availableItems = new Dictionary<string, string>(); 
    public Dictionary<string, string> AvailableItems 
    { 
     get { return _availableItems; } 
     set { _availableItems = value; } 
    } 

    // item ids requested by user 
    private List<string> _requestedItems = new List<string>(); 
    public List<string> RequestedItems 
    { 
     get { return _requestedItems; } 
     set { _requestedItems = value; } 
    } 
} 

主視圖模型然後由多個RequestableLists的必要:

public class SimpleRequestViewModel 
{ 
    public UserInfo userInfo { get; set; } 
    public RequestableList Software {get;set;} 
    public RequestableList Hardware {get;set;} 
    public RequestableList Access {get;set;} 
    public string SoftwareAdditionalInfo { get; set; } 
    public string HardwareAdditionalInfo { get; set; } 
    public string AccessFileMailShare { get; set; } 
    public string AccessAdditionalInfo { get; set; } 
    public string SoftwareJustification { get; set; } 
    public string HardwareJustification { get; set; } 
    public string AccessJustification { get; set; } 
    public string Comment { get; set; } 
} 

我已經創建了SimpleRequestViewModel強類型視圖(及其變體)和一個強類型的EditorTemplate爲RequestableList,用於連接雙重列表框,過濾和jquery。所有渲染都很好,正在工作,但代碼目前聞起來。

在發佈到控制器時,如果模型有效,我必須將其轉換爲可讀的文本描述,以便在呼叫中心應用程序中創建新票。讓控制器將該翻譯轉換爲可讀文本並不妥當,但在嘗試設計另一個類來轉換視圖模型時遇到障礙。

  1. 在將請求轉換爲文本之前,只發布選定的項目值,我必須首先查找提供的值(它們在描述中是必需的)的適當文本。控制器是當前唯一可以訪問此查詢查詢的呼叫中心數據模型的對象。
  2. 有2個相似的ViewModel包含RequestableLists的不同組合,所以任何翻譯者都必須能夠翻譯各種組合。一個只有硬件和軟件,另一個可能有硬件軟件,還有幾個可請求列表。

我認爲直接覆蓋在視圖模型的ToString(),但沒有這樣的業務邏輯(有條件的渲染)出現,並再次,一旦公佈,視圖模型不包含在所選項目的文本listbox,所以它需要訪問數據模型。 將當前在控制器中處理的發佈值轉換爲文本,因爲它在switch語句中處理。控制器獲取每個發佈的RequestableList並在構建新的故障單描述之前填充原始「可用」字段。

switch (requestCategory) 
{ 
    case RequestableCategory.Software: 
     itemList = sde.GetSoftware(); 
     break; 
    case RequestableCategory.Hardware: 
     itemList = sde.GetHardware(); 
     break; 
    case RequestableCategory.Access: 
     itemList = sde.GetAccess(); 
     break; 
    case RequestableCategory.Telecom: 
     itemList = sde.GetTelecom(); 
     break; 
    default: 
     throw new ArgumentException(); 
} 

所以,我的問題(S):

  1. 什麼模式是技術,你會推薦進行發佈視圖模型來描述車票翻譯?
  2. 當您需要文字和價值時,您通常如何處理「選擇框」問題?
  3. 有沒有更好的方法來解決這個問題?

同樣,我希望這是我的學習經驗,我更願意在需要時提供額外的信息或說明更多。

回答

1

幾點建議:

  1. 摘要,做呼叫中心提交到自己的類中的邏輯。提供(從控制器)訪問呼叫中心數據庫所需的任何依賴關係。有不同的方法來處理使用重載的各種視圖模型。據推測,這些描述來自DB,因此您可以根據此類中的值從DB中提取描述。這個類也可以負責爲顯示操作構建視圖模型。請注意,使用此模式,類可以直接與數據庫進行交互,通過存儲庫或甚至通過Web服務/ API進行交互。

  2. 如果性能是第二次從數據庫查找描述時遇到問題,請使用實施某種緩存的存儲庫模式。我懷疑它不會是除非你的呼叫中心非常大,但這將是優化查詢邏輯的地方。存儲庫可以是控制器傳遞給提交類的東西。

  3. 如果您不需要直接在控制器中訪問數據庫,請考慮直接將代理類作爲依賴項傳遞。

它可能看起來像:

private ICallCenterBroker CallCenterBroker { get; set; } 

public RequestController(ICallCenterBroker broker) 
{ 
    this.CallCenterBroker = broker; 
    // if not using DI, instantiate a new one 
    // this.CallCenterBroker = broker ?? new CallCenterBroker(new CallCenterRepository()); 
} 

[HttpGet] 
public ActionResult CreateSimple() 
{ 
    var model = this.CallCenterBroker.CreateSimpleModel(this.User.Identity.Name); 
    return View(model); 
} 


[HttpPost] 
public ActionResult CreateSimple(SimpleRequestViewModel request) 
{ 
    if (Model.IsValid) 
    { 
     var ticket = this.CallCenterBroker.CreateTicket(request); 
     // do something with ticket, perhaps create a different model for display? 
     this.CallCenterBroker.SubmitTicket(ticket); 
     return RedirectToAction("index"); // list all requests? 
    } 
    return View(); 
} 
+0

完美。出於某種原因,我厭惡在除控制器和視圖以外的任何其他視圖模型中使用ViewModel。現在經紀人已經到位,圈套複雜性大幅下降。感謝您的答覆。 – Shawn 2011-05-09 18:17:21