亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在面向服務的體系結構中,映射器調用服務是一種好的做法嗎?

在面向服務的體系結構中,映射器調用服務是一種好的做法嗎?

胡說叔叔 2023-03-23 14:17:31
我想知道在自定義對象映射器中調用/注入(微)服務是否是一種好習慣。此映射器將實體轉換為 DTO。在這個 DTO 中有一個字段包含一些值的總和(需要一些業務邏輯)。我定義了一個服務來集中邏輯,因為它在許多其他地方使用。
查看完整描述

2 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

雖然嚴格來說從映射器調用服務并沒有什么不對,但它確實給映射器添加了依賴,映射器通常是一個純對象(Plain Old Java Object,POJO),只是簡單地將一種類型的對象轉換為另一種類型。另一種方法是將所需信息作為參數傳遞到映射器中。例如,假設您當前的設計類似于以下內容:


public class Foo { /* ... */}

public class FooDto { /* ... */}


public class FooService {


    public FooResults getSomeResults() { /* ... */ }

}


public class FooMapper {


    private final FooService service;


    public FooMapper(FooService service) {

        this.service = service;

    }


    public FooDto convert(Foo foo) { 


        FooResults results = service.getSomeResults();


        // ... use results ...

    }

}

您可以將in 作為參數傳遞給方法,而不是依賴FooMapper于:FooServiceFooResultsconvert


public class FooMapper {


    public FooDto convert(Foo foo, FooResults results) {    

        // ... use results ...

    }

}

這種方法的優點是FooMapper不再依賴于FooService. 相反,調用該方法的客戶端convert必須具有對 的引用才能FooService獲取FooResults對象。


查看完整回答
反對 回復 2023-03-23
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

映射器將一種數據結構轉換為另一種數據結構。因此它應該只依賴于這兩個數據結構之一。


 +------------------+              +----------+           +------------------+   

 | data structure 1 |   <-----     |  mapper  |  ----->   | data structure 2 | 

 +------------------+              +----------+           +------------------+  

如果映射器使用服務,它也依賴于該服務。這意味著它知道數據是如何獲得的。我猜你的映射器依賴于具體的服務。因此,映射器將受到其中一個數據結構的更改和該服務的更改的影響。


 +------------------+              +----------+           +------------------+   

 | data structure 1 |   <-----     |  mapper  |  ----->   | data structure 2 | 

 +------------------+              +----------+           +------------------+  

                                        |

                                        V

                                   +----------+    

                                   |  service | 

                                   +----------+ 

可能很難模擬該服務以進行測試。也許該服務依賴于某種存儲庫或者它自己執行 SQL。


通過引入一個從數據獲取方式中抽象出來的接口,使映射器獨立于數據結構的來源可能會更好。然后您的服務可以實現該接口或創建一個簡單的適配器。


 +------------------+              +----------+           +------------------+   

 | data structure 1 |   <-----     |  mapper  |  ----->   | data structure 2 | 

 +------------------+              +----------+           +------------------+  

                                        |

                                        V

                               +------------------+          +--------------+

                               |   Data1Provider  | <------  |   service    |

                               +------------------+          +--------------+

使用這種方法,您可以通過引入如何獲取數據的穩定抽象來反轉對服務的依賴性。這就是所謂的依賴倒置。


它可能是一個看起來像這樣的簡單界面


 public interface Data1Provider {

      public FooResults getResults();

 }

這個接口可以很容易地模擬測試。


另一個好方法是在調用映射器之前簡單地調用服務。只需將服務返回的數據傳遞給映射器即可。我不會在這里詳細介紹,因為Justin Albano 的回答已經表明了這一點。


查看完整回答
反對 回復 2023-03-23
  • 2 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號