2012-04-13 148 views
2

我目前在使用實體框架的同時在ASP.NET MVC 4中工作。我從來沒有與MVC工作過,並有建立一個項目具有以下層:MVC業務邏輯訪問模型

  • GUI(型號,視圖,控制器,...)
  • DAL(實體數據庫和信息庫+ IRepository)
  • BL(我的查詢)
  • COMMON
  • WCF
  • 測試

現在,我試圖在我的BL中使用來自我的GUI層的模型編寫查詢。因爲你不能簡單地引用GUI,所以我不知道該怎麼做。

下面是我嘗試向代碼:

在我的BL:

public static List<PSNAdres> GetAdres(IZoekRepository repo) 
{ 
    List<PSNAdres> lijstTypes = (from t in repo.PSNAdres 
         select new PSNAdres {t.Gemeente, t.Straat, t.Postcode}).ToList(); 

    return lijstTypes; 
} 

正如我說:我是新來的MVC。這種分層佈局是我們的MVC專家告訴我們使用的,因爲這是他的工作原理。

+2

這裏可能值得檢查一下你的術語。 GUI應該處理'視圖'(或可能是視圖模型),但不直接處理模型。 – dougajmcdonald 2012-04-13 08:26:03

+0

一般來說,你的BL(Domain)應該只處理域對象。如果您需要GUI(視圖)模型在GUI層(或爲此唯一目的的層)進行轉換。 – 2012-04-13 08:27:07

+0

添加了一些關於我的GUI具有的附加信息 – whodares 2012-04-13 08:36:49

回答

2

我不確定你要求什麼,但這是我的答案。

查看模型:

public class AddressListViewModel 
{ 
    public List<AddressViewModel> AddressList { get; set; } 
    public bool CanAdd { get; set; } 
} 

public class AddressViewModel 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
    public string Street { get; set; } 
    public bool CanEdit { get; set; } 
    public bool CanDelete { get; set; } 
} 

BL:呈現地址列表簡單的場景

public static List<Address> GetAddressList()//Doesn't take repository here, repositories are injected in constructor 
{ 
    return adresRepo.PSNAdres.ToList(); 
} 

控制器

public class AddressController : BaseController 
{ 
    public ActionResult List() 
    { 
     var addressList = blObject.GetAddressList(); 
     var model = new AddressListViewModel(); 
     model.AddressList = addressList.Select(a => 
      new AddressViewModel 
      { 
       Country = a.Country.Name, 
       City = a.City, 
       Street = a.Street, 
       CanDelete = ...check user access here..., 
       CanEdit = ...check user access here... 
      }); 

     model.CanAdd = ...check user access here... 

     return View(model); 
    } 
} 
+0

感謝這裏的答案,但這是我現在試圖工作,它給我的問題。 GUI,BL,DAL ......都在不同的項目中,但在同一個解決方案文件中。由於從BL到GUI的引用是不允許的,我正在尋找一種方法來解決它。目前BL(在BL項目中)無法訪問我的PSNAdres模型(在GUI中),我正在尋找解決此問題的方法。 – whodares 2012-04-13 09:16:14

+0

@ThomasSchellekens:PSNAdres如何在GUI中? PSNAdres是代表數據庫表還是創建用於演示目的的類。如果首先,它不應該在GUI中。 – LukLed 2012-04-13 09:18:49

+0

我在我的DAL中獲取我的數據庫(視圖)。然後我把它放在存儲庫中,然後轉到我的BL上。在那裏,我嘗試使用PSNAdres(GUI中的模型),它將我視圖中的某些列映射到PSNAdres。關於MVC,我不確定是否有終結者,所以我希望我能正確解釋它。 – whodares 2012-04-13 09:22:18

1

您的GUI層只是一個功能性的消費由提供其他層。

因此,您的問題源於模型在那裏。如果你正在將你的項目分解成圖層,你應該移動模型!

由Visual Studio創建的默認項目僅在GUI層中具有用於人們不會將GUI項目拆分爲圖層的情況下的模型。也就是說,初學者。它與MVC方法無關。在分割圖層時,應該將模型移動到「域圖層」(請參見下文)。

因此,不要再過度勞累,將模型移出GUI層。

比您的設計更實用的方法是遵循Steve Sanderson和Adam Freeman(Pro ASP.NET MVC 3.0 Framework,Apress [第4版的書尚未出版])提倡的域設計。它與你的設計相似,但更實用。在沒有詳細討論的情況下,通過這種方法,您可以將模型和商業圖層分離爲一個Domain項目。這給你一個更實際的設計。

除非你有特定的要求這樣做,我認爲WCF可能是矯枉過正。 MVC旨在在您需要的地方提供面向服務的方法。

我會推薦閱讀S桑德森和弗里曼書。它會讓你很痛苦。

+0

+1爲書籍參考,愛這些傢伙! – dougajmcdonald 2012-04-13 15:04:54