2014-01-10 87 views
1

如何爲我的MVC項目創建外部DAL?數據訪問層和MVC分離?

有一件事我真的沒有得到。假設我在我的MVC項目中有一個模型。模型的名稱是一個Person {int id,字符串名稱}。

現在在我的DAL我有一個方法:

公衆人物選擇(INT ID) - 從數據庫加載數據並返回Person對象。

如果DAL是MVC項目的一部分,此工作正常。然而,當我爲外部DAL創建一個類庫(因此我可以在不引用整個MVC項目的情況下在另一個應用程序中使用它)時,它不會知道Person模型,因爲所有模型都隱藏在MVC項目中。

我無法從DAL引用MVC項目,因爲MVC項目需要引用DAL使用它。我對Entity Framework不感興趣我想要我自己的解決方案(不知道EF甚至解決了這個問題)。

有沒有一個祕密的方法來做到這一點?或者我的方法(傳遞整個模型)錯誤,我的Select方法應該返回某種數組或列表的屬性?我相信這是表數據網關的概念(不確定),只是屬性傳遞的不是整個對象。

回答

1

你的問題指出:

「當我創建一個類庫我的外部DAL(這樣我就可以在 其他應用程序使用它沒有引用整個MVC項目),它不會 認識的人的模型,因爲所有車型都隱藏MVC 項目中。「

我會承認你選擇的措辭對我沒有意義如果你在DAL上有一個公開的方法,模型不能被」隱藏「 - 它們必須具有相同的[public ]可訪問性作爲您的方法POCO對象應該在您的應用程序中最常見的程序集中定義,以便它們可以在整個程序中共享如果您的代碼通過DAL加載數據,可能它使用的是DAL返回的模型 - 因此DAL是爲那些最合乎邏輯的地方,其基本前提是,你要保持你的項目儘可能簡單。

如果你有這樣一個場景,部分應用程序可能永遠不會接觸到DAL,但你仍然要讓你的模特出現,然後我推薦e兩種策略:

  1. 創建一個單獨的「模型」項目,並在需要模型的地方引用(最好是在有廣泛的對象模型集時)。
  2. 使用VisualStudio的「Add as Link」的模型文件導入到他們正在使用的項目(S)(如果你有在那裏他們將可以獨立使用DAL的相對較少的模型和幾個場景)
+0

Sry。這只是一個調整的數字。 '隱藏'我不是指私人我的意思是它不知道在DAL項目中,因爲它是在MVC項目中聲明的。 在DAL項目中聲明模型肯定是一種方式,但我不確定它是否不打破MVC模式。 – Safiron

+1

我對MVC(N層架構)的理解是,您希望您的模型無處不在。所以把它們放在某種不是普遍存在的地方是違反了這種模式。 :) – theMayer

2

您需要在數據訪問層項目中定義您的模型類。這樣他們將可用於DAL項目(因爲他們在項目中)和MVC項目(因爲它參考DAL項目)。

實體框架會照顧這一點,但僅僅是由於事實生成的實體模型變爲/位置相同的位置EF會生成.edmx文件的一部分。

你應該能夠基本上拖/放你的模型文件夾到你的DAL。但是,請注意,您的名稱空間將被破壞,您需要更新每個文件中的名稱空間。此外,您需要在您使用其中一個模型的MVC項目中的任何位置添加適當的引用。例如,如果你的模型是在Data.Models命名空間中,你需要在你的控制器頂部以下內容:

using Data.Models; 
+0

當然,將模型聲明爲DAL的一部分是一種方式,它不打破MVC模式嗎?只是問... – Safiron

+1

@Safiron - 你聲明你的類沒有任何影響MVC模式。我可以有一個項目,如果我想每個單一的模型,以及一個真正緩慢的編譯項目,它仍然是MVC,你能解釋爲什麼你認爲它會破壞嗎? – Tommy

0

整個POCO類需要在你的DAL。只應該在你的MVC模式的東西是從DAL對象映射到View:

private WorksiteAddress _worksiteToEdit { get; set; } 
    public WorksiteAddress WorksiteToEdit 
    { 
     get 
     { 
      if (_worksiteToEdit != null) return _worksiteToEdit; 

      if (WorksiteId != null) 
      { 
       using (var db = new YourDALContext()) 
       { 
        _worksiteToEdit = db.WorksiteAddresses.FirstOrDefault(x => x.Id == WorksiteId); 
       } 
      } 

      if(_worksiteToEdit == null) _worksiteToEdit = new WorksiteAddress(); 

      return _worksiteToEdit; 
     } 
     set { _worksiteToEdit = value; } 
    } 

    [Required, DisplayName("Address")] 
    public string StreetAddress 
    { 
     get { return WorksiteToEdit.StreetAddress; } 
     set { WorksiteToEdit.StreetAddress = value; } 
    } 

    [Required] 
    public string City 
    { 
     get { return WorksiteToEdit.City; } 
     set { WorksiteToEdit.City = value; } 
    } 

    [Required] 
    public string State 
    { 
     get { return WorksiteToEdit.State; } 
     set { WorksiteToEdit.State = value; } 
    } 

    [Required, DisplayName("Zip Code")] 
    public string ZipCode 
    { 
     get { return WorksiteToEdit.ZipCode; } 
     set { WorksiteToEdit.ZipCode = value; } 
    } 

Worksite對象在上面的例子應該在你的DAL完全存在(包括你所說的saveOrUpdate()方法方法從這個模型時,你需要保存它)

+0

這是什麼做的? – theMayer

+0

1)防止黑客的數據注入 2)分離關注點 –

-3

-On你DAL項目中使用的NuGet到 - 現在參考DAL項目添加ASP.NET MVC -add控制器,模型和視圖文件夾在你的DAL項目主項目

+0

爲什麼哦爲什麼你會安裝MVC在非網絡數據層項目上?然後將整個項目移到DAL中,以便將其引回到MVC項目中? – Tommy

1

添加DAL中的模型類。創建ViewModel項目並添加具有定義的人員屬性的PersonVM類。在你選擇的方法中填充PersonVM並在DAL中添加Viewmodel項目的引用(理想的是一個業務層項目)和MVC應用在視圖中使用Viewmodel類而不是模型