2016-12-05 98 views
0

我們已經實現了適配器的設計模式,他們的工作是:設計模式 - 脂肪適配器

  1. 充當服務和數據訪問層之間的聯絡人。
  2. 將原始數據(從數據源,內部或外部)轉換爲域特定數據。做必要的驗證和按摩。
  3. 有時,進行DAO調用可能取決於輸入參數中不容易獲得的數據,也可能需要根據輸入數據進行額外的服務調用。換句話說,適配器不能總是在服務和DAO之間進行1:1映射。它可以根據輸入參數將來自服務的相同呼叫映射到不同的DAO呼叫。

項目#3開始讓我擔心,因爲適配器變得比我原先想象的更加複雜。我不知道設計模式是否需要修剪適配器。有一個嗎?建議?

回答

1

你已經使用了我喜歡稱之爲「瑞士軍刀」的模式。

最佳實踐說,你應該改掉上課至少3個班級,每個班級需要一個班級。

+0

我認爲在分離1和2時沒有任何價值。2層之間的接口必須將數據轉換爲數據的代碼,這是給定的。即使在GOF中,他們也這樣做,我認爲這不是經紀人模式,也許因爲它與適配器沒有區別。 3是我所關心的,我在我的問題中說過。 –

+0

@Abhi在分離1和2時通常有價值,而且我在很多場合都做到了這一點。 1和2實際上幾乎無關。但是你正處於決定的最佳位置。只要你考慮你的決定,並且可以向想要知道你爲什麼做出改變的人解釋它,那就沒問題。最糟糕的情況是你以後需要做更多的工作。巴斯特案,這一切都有效,每個人都很開心。 – Bohemian

-2

而不是使用適配器或完整的存儲庫(CRUD操作),我會使用一個IReader接口讀取和訪問模式插入更新刪除,所以你可以分離領域邏輯從infraestructure(persistance)細節,這是理念:

public class MyBusinessObject : IAcceptBusinessVisitor, IAcceptMyBusinessIdVisitor 
{ 
    private readonly string _id; 

    private string MyPrivateProp { get; set; } 
    //Fully encapsulated object 
    public MyBusinessObject(string id, string myPrivateProp) 
    { 
     _id = id; 
     MyPrivateProp = myPrivateProp; 
    } 

    public void UpdateMyProp(string newProp) 
    {    
     if (string.IsNullOrWhiteSpace(newProp)) throw new ArgumentNullException(nameof(newProp)); 
     //Business rules ... 
     MyPrivateProp = newProp; 
    } 

    public void Accept(IMyBusinessObjectVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id, MyPrivateProp); 
    } 

    public void Accept(IMyBusinessIdVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id); 
    } 
} 

public interface IAcceptBusinessVisitor 
{ 
    void Accept(IMyBusinessObjectVisitor visitor); 
} 

public interface IAcceptMyBusinessIdVisitor 
{ 
    void Accept(IMyBusinessIdVisitor visitor); 
} 

public interface IMyBusinessObjectVisitor 
{ 
    void Visit(string id, string prop); 
} 

public interface IMyBusinessIdVisitor 
{ 
    void Visit(string id); 
} 

public class SavePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Save to Database 
    } 
} 

public class UpdatePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Update to Database 
    } 
} 

public class DeleteVitor : IMyBusinessIdVisitor 
{ 
    public void Visit(string id) 
    { 
     //Delete in Database 
    } 
} 

這裏閱讀:

public interface IMyBusinessObjectReader 
{ 
    MyBusinessObject Read(string id); 
} 

class MyBusinessObjectReaderFromDb : IMyBusinessObjectReader 
{ 
    public MyBusinessObject Read(string id) 
    { 
     //Read from database 
     string myPrivateProp = ""; 
     return new MyBusinessObject(id, myPrivateProp); 
    } 
} 

下一步可能是添加泛型讀取和遊客。在這種情況下,您最終會得到很小的類,並獲得靈活性,以及​​像單一響應性,接口隔離等固體原理的好處。因此,您可以創建一個豐富的封裝域並使用一些設計原則擴展其功能。 關心!

+1

我很欣賞你花時間,但我不認爲你的答案是相關的。首先,我沒有提及任何有關CRUD的內容。實際上,就我而言,只有各種讀取方法。其次,訪問者模式的目的是在有明確的層次結構時使用,並且需要添加一個新的方法,該方法不適用於層次結構中的所有類,或者添加它對層次結構是破壞性的,其中沒有一個與我在文章中描述的問題有關。 [這裏](https://www.cs.virginia.edu/~horton/cs4240/slides/files/visitor.pdf)是訪客模式的一個很好的例子 –