簡體   English   中英

設計模式-胖適配器

[英]Design Pattern - Fat adapter

我們已經實現了適配器設計模式,其工作如下:

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

隨着適配器變得比我最初想象的要復雜,第3項開始讓我擔心。 我不知道用於精簡適配器的設計模式。 有一個嗎? 有什么建議嗎?

您使用了我喜歡的“瑞士軍刀”模式。

最佳做法是,您應該將您的課程至少分為3個班級,每個問題一個班級。

而不是使用適配器或完整的存儲庫(CRUD操作),我將使用IReader接口進行讀取,並使用訪問者模式進行插入更新刪除,因此您可以將域邏輯與基礎結構(持久性)詳細信息分開,這是這樣的想法:

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);
    }
}

下一步可能是添加閱讀和訪問者的泛型。 在這種情況下,您最終只剩下很少的類,並且獲得了靈活性以及諸如單一職責,接口隔離等堅實原則的好處。因此,您可以創建一個豐富的封裝域並使用某些設計原則來擴展其功能。 問候!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM