2017-07-15 77 views
0

我在寫一個簡單的web應用程序,並遇到了一個架構問題。假設我的BLL層中有一個Customer類:避免依賴於表示層和DAL

public class Customer 
{ 
    public int Id { get; set; } 

    public Person PersonalData { get; set; } 

    public int? MaximalPrice { get; set; } 

    public string Note { get; set; } 

    public Customer() 
    { 
     PersonalData = new Person(); 
    } 
} 

我打算將此類的數據創建分爲兩個階段。在第一階段,用戶將提供關於客戶的基本信息,以便他能夠在以後完成。所以我在表示層創建了兩個視圖。其中一個只顯示基本信息,其次是所有。

基礎:

<div class="input-field col s6"> 
     <i class="material-icons prefix">phone</i> 
     @Html.TextBoxFor(m => m.TelephoneNumber, new {id = "icon_telephone", mask = "telephoneNumber"}) 
     @Html.LabelFor(m => m.TelephoneNumber) 
    </div> 
    <div class="input-field col s6"> 
     <i class="material-icons prefix">credit_card</i> 
     @Html.TextBoxFor(m => m.MaximalPrice, new { id = "credit_card" }) 
     @Html.LabelFor(m => m.MaximalPrice) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s12"> 
     <i class="material-icons prefix">note</i> 
     @Html.TextBoxFor(m => m.Note, new { id = "note_add" }) 
     @Html.LabelFor(m => m.Note) 
    </div> 
</div> 

全部(的視圖部分):

<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.FirstName) 
     @Html.LabelFor(m => m.FirstName) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.LastName) 
     @Html.LabelFor(m => m.LastName) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.Street) 
     @Html.LabelFor(m => m.Street) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.City) 
     @Html.LabelFor(m => m.City) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.BirthDate) 
     @Html.LabelFor(m => m.BirthDate) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.TelephoneNumber , new { mask = "telephoneNumber" }) 
     @Html.LabelFor(m => m.TelephoneNumber) 
    </div> 
</div> 

現在,我做了一個假設,即當用戶將創造客戶的基本版本,他將無法看到它在完整的數據客戶列表中,當他完成客戶數據時,他將無法在基本客戶列表中看到它。 爲了實現它,我正在考慮兩種解決方案。

  1. 在BLL中創建函數,該函數將遍歷我的類的所有屬性,並檢查是否有任何非基本的屬性已經不是空的。
  2. 延長客戶的DAL域,並添加列會顯示客戶是否是「基本」還是「全」

但沒有上述解決方案是完美的。首先會在大數據集中表現緩慢,因爲會遍歷所有客戶條目的所有屬性。所以看來這應該避免。 我不喜歡第二個選項,它似乎解決了這個問題,因爲它在表示層和數據訪問層之間創建了一個依賴關係。我覺得在數據庫中創建額外的另一列僅用於演示目的不是一個好主意。

所以,我的問題是:有沒有更好的選擇?你對這個選擇有什麼看法?你會如何解決這個問題?

+1

在數據庫中添加一個新的列,以確定客戶是否基本,不是一個壞主意。這將使您能夠在諸如報告等其他許多地方過濾此類客戶。其他選項是根據可以確定客戶是否基本的任何其他列進行過濾。假設基本客戶的名字爲空,但對於完整客戶而言,它永遠不會爲空。總而言之,您應該根據一些標準對客戶進行篩選,而不是檢查所有屬性值。 –

+0

謝謝,我想我會選擇第二個選項。你認爲如何將該邏輯放入表示層的基本客戶模型視圖中? –

+0

您應該在篩選記錄的存儲庫層或數據訪問層中擁有該邏輯。您應該有單獨的方法來檢索基本客戶和完整客戶,並調用適當的方法來填充相應的視圖模型。 –

回答

0
  • DAL應該能夠過濾柱等DAL.Custumers.Get(_columns_)和BLL根據登錄在該用戶類型作出決定。
  • 0

    創建兩個基本形式和完全的ViewModels形成。說.. BasicInfoFormViewModel和FullInfoViewModel,只有屬性包含在其特定的形式。

    提交表單時,在控制器操作中,將視圖模型數據映射到Customer類(或任何您用作實體的類),並保存該實體。

    我不認爲你需要擴展域來表明客戶是基本的還是完整的。您可以簡單地擁有一些服務層邏輯來檢查實體並確定基本/完整狀態。您的意見將使用此決心來顯示必要的表格。

    相關問題