2013-02-21 210 views
0

我目前正在爲我們的新應用程序構建數據訪問層和業務邏輯層類,並且我有一個問題(很明顯)。首先,這裏有一些細節,可以幫助:通用DAL/BLL類

  • 使用實體框架5
  • 每個「層」在不同的類庫和命名空間(即App.Model,App.DAL分離模型類和數據訪問,App.BLL)

從DAL開始 - 我決定爲所有DAL類編寫一個基類來繼承。

public abstract class DALBase<T> : IDisposable 
{ 
    protected AppEntities context; 
    protected DbSet set; 

    public DALBase() 
    { 
     context = new OECCORPEntities(); 
     set = context.Set(typeof(T)); 
    } 

    protected virtual void Save() 
    { 
     context.SaveChanges(); 
    } 

    public virtual void Add(T model) 
    { 
     set.Add(model); 
     Save(); 
    } 

    public virtual T Get(int id) 
    { 
     return (T)set.Find(id); 
    } 

    public virtual List<T> GetAll() 
    { 
     return set.OfType<T>().ToList(); 
    } 

    public virtual void Delete(int id) 
    { 
     T obj = Get(id); 
     set.Remove(obj); 
     Save(); 
    } 

    public virtual void Update() 
    { 
     Save(); 
    } 

    public void Dispose() 
    { 
     context.Dispose(); 
    } 
} 

如您所見,基類實現了一個泛型類型,它應該是DAL類負責處理的模型的類型。使用泛型類型,在構造函數中,它使用泛型參數的類型創建一個DbSet - 在以下預定義類似CRUD的虛擬函數(add,get等)中使用該類型。

然後我明白了 - 等一下...因爲它是通用的,我實際上不必爲每個模型都實現DAL類。我可以寫這樣的東西:

public class GenericDAL<T> : DALBase<T> 
{ 
    public GenericDAL() : base() {} 
} 

......我可以使用任何模型。好的,等到業務邏輯層。我爲BLL創建了一個基類:

public abstract class BLLBase<T> 
{ 
    protected GenericDAL<T> dal; 

    public BLLBase() 
    { 
     dal = new GenericDAL<T>(); 
    } 

    public virtual void Add(T model) 
    { 
     dal.Add(model); 
    } 

    public virtual T Get(int id) 
    { 
     return dal.Get(id); 
    } 

    public virtual List<T> GetAll() 
    { 
     return dal.GetAll(); 
    } 

    public virtual void Delete(int id) 
    { 
     dal.Delete(id); 
    } 

    public virtual void Update() 
    { 
     dal.Update(); 
    } 
} 

...它使用GenericDAL來完成它的工作。因此,在一個simular時尚,我只是寫了GenericBLL類,看起來像這樣:

public class GenericBLL<T> : BLLBase<T> 
{ 
    public GenericBLL() : base() { } 
} 

並測試它,一個簡單的控制檯應用程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
     GenericBLL<ADMIN> bll = new GenericBLL<ADMIN>(); 
     List<ADMIN> admins = bll.GetAll(); 
    } 
} 

...其中,「管理」是模型類型。奇蹟般有效。

這個想法背後是爲了避免必須爲每個模型編寫DAL/BLL類,除非它需要額外的功能。有人可以告訴我爲什麼我不想不想想這樣做嗎?我認爲通用的DAL/BLL類可以完成工作並節省開發時間。

謝謝你的時間。

回答

1

好,一個缺點是,如果你決定以後增加一些業務規則,你將不得不從GenericBLL [無論]切換類型WhateverBLL

一個明顯的解決方案是創建一個從繼承的類GenericBLL [無論]。如:

public class WhateverBLL : GenericBLL<Whatever> 

並改用此類。

+0

沒錯。如果一個模型需要更多的標準crud函數,我會爲它實現一個特定的BLL類。很多「模型」所需的功能是非常基礎的。所以泛型類將會提供很多服務。 – zday 2013-02-21 18:48:43

+0

我建議您從一開始就爲所有實體編寫特定的BLL類。他們只需要從通用基類繼承的存根。通過這樣做,如果您稍後決定添加一些業務邏輯,則不必更改類型。 – 2013-02-22 08:26:47

+0

偉大的建議 - 很有意義。謝謝! – zday 2013-03-05 18:06:25

0

現在,你的BLL並不是特別增值。每個電話只是一個到另一個層的傳遞。也許這就是你的應用程序的簡單性(並且感謝你幸運的明星,你是如此幸運),或者你可以將我的行爲分類爲生活在別處的實際業務邏輯。

對我來說,業務邏輯就是完成數據持久化,檢索數據後完成的所有事情,以及類似的事情。決定,道路上的叉子,所採取的行動。實際上,通過比較保存和檢索數據通常是非常微不足道的。

所以當我看着你的通用DAL基類時,我認爲這是一個好的開始。我可能會從中提取一個接口,以便在測試時替換它。就目前而言,你的班級繼承的基地並沒有增加任何價值。不要爲了它而創建圖層和類,請確保它增加了價值,並以某種方式讓您的生活更輕鬆。

我看着你的通用BLL類,我想你也許有你真正業務邏輯代碼隱藏藏某種形式的,或在一個控制檯應用程序類文件中。雖然肯定有可能會有一般適用的功能,只是在類型上有所不同,但我不認爲一類是您想要的地方。我的建議是重新考慮你認爲你的實際業務邏輯。 DAL的簡單傳遞層可能不是它。

+0

尚未實際實現任何實際業務邏輯。這是該項目的開始。正如我熟悉這種模式,使用BLL的應用程序不應該知道DAL。所以基本的破碎函數只是這個時候需要的最低限度的東西。 當需要添加新的業務邏輯時,我會*編寫一個特定於該模型的BLL類,該BLL類將具有所需的功能。這個想法是,我只需要在需要時寫出那些特定的類,而不是每一個。我們需要的很多東西對於某些型號來說真的很基本。 – zday 2013-02-21 18:44:27