2 回答
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
雖然嚴(yán)格來說從映射器調(diào)用服務(wù)并沒有什么不對(duì),但它確實(shí)給映射器添加了依賴,映射器通常是一個(gè)純對(duì)象(Plain Old Java Object,POJO),只是簡單地將一種類型的對(duì)象轉(zhuǎn)換為另一種類型。另一種方法是將所需信息作為參數(shù)傳遞到映射器中。例如,假設(shè)您當(dāng)前的設(shè)計(jì)類似于以下內(nèi)容:
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 作為參數(shù)傳遞給方法,而不是依賴FooMapper于:FooServiceFooResultsconvert
public class FooMapper {
public FooDto convert(Foo foo, FooResults results) {
// ... use results ...
}
}
這種方法的優(yōu)點(diǎn)是FooMapper不再依賴于FooService. 相反,調(diào)用該方法的客戶端convert必須具有對(duì) 的引用才能FooService獲取FooResults對(duì)象。
TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
映射器將一種數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為另一種數(shù)據(jù)結(jié)構(gòu)。因此它應(yīng)該只依賴于這兩個(gè)數(shù)據(jù)結(jié)構(gòu)之一。
+------------------+ +----------+ +------------------+
| data structure 1 | <----- | mapper | -----> | data structure 2 |
+------------------+ +----------+ +------------------+
如果映射器使用服務(wù),它也依賴于該服務(wù)。這意味著它知道數(shù)據(jù)是如何獲得的。我猜你的映射器依賴于具體的服務(wù)。因此,映射器將受到其中一個(gè)數(shù)據(jù)結(jié)構(gòu)的更改和該服務(wù)的更改的影響。
+------------------+ +----------+ +------------------+
| data structure 1 | <----- | mapper | -----> | data structure 2 |
+------------------+ +----------+ +------------------+
|
V
+----------+
| service |
+----------+
可能很難模擬該服務(wù)以進(jìn)行測試。也許該服務(wù)依賴于某種存儲(chǔ)庫或者它自己執(zhí)行 SQL。
通過引入一個(gè)從數(shù)據(jù)獲取方式中抽象出來的接口,使映射器獨(dú)立于數(shù)據(jù)結(jié)構(gòu)的來源可能會(huì)更好。然后您的服務(wù)可以實(shí)現(xiàn)該接口或創(chuàng)建一個(gè)簡單的適配器。
+------------------+ +----------+ +------------------+
| data structure 1 | <----- | mapper | -----> | data structure 2 |
+------------------+ +----------+ +------------------+
|
V
+------------------+ +--------------+
| Data1Provider | <------ | service |
+------------------+ +--------------+
使用這種方法,您可以通過引入如何獲取數(shù)據(jù)的穩(wěn)定抽象來反轉(zhuǎn)對(duì)服務(wù)的依賴性。這就是所謂的依賴倒置。
它可能是一個(gè)看起來像這樣的簡單界面
public interface Data1Provider {
public FooResults getResults();
}
這個(gè)接口可以很容易地模擬測試。
另一個(gè)好方法是在調(diào)用映射器之前簡單地調(diào)用服務(wù)。只需將服務(wù)返回的數(shù)據(jù)傳遞給映射器即可。我不會(huì)在這里詳細(xì)介紹,因?yàn)镴ustin Albano 的回答已經(jīng)表明了這一點(diǎn)。
添加回答
舉報(bào)
