我有一個遵循領域驅動設計規則的應用程式。DDD的規則之一是領域層不應依賴于基礎設施層。我有一個工具可以檢查從域到基礎架構是否存在任何依賴項(匯入)。在我的基礎設施層,我有一個這樣的類層次結構:

在我的領域層,像這樣:

現在,我需要將我的域類映射到基礎設施物體,以便將它們保存在我的資料庫中。
我的域中有一個輸出埠,它是一個介面:
// infra/ports/out/RuleRepository.java
public interface RuleRepository {
Rule save(Rule rule);
}
該介面在基礎設施層實作:
// domain/RuleRepositoryJpaAdapter.java
public class RuleRepositoryJpaAdapter implements RuleRepository {
// extends CrudRepository<RuleEntity, Long>
RuleCrudRepository jpaRepository;
RuleMapper mapper;
@Override
public Rule save(Rule rule) {
return jpaRepository.save(mapper.mapToEntity(rule))
.mapToDomain();
}
}
我正在尋找一種mapToEntity無需檢查規則型別即可實作的方法。最好的方法是添加一個mapToEntity方法Rule,IpRule,BlackListRule但是這將打破單元測驗,檢查是否有域名和基礎設施層之間的任何進口。如果有其他方法嗎?
我現在所擁有的:
public class RuleMapper {
public RuleEntity mapToEntity(Rule rule) {
if (rule instanceof IpRule) {
return new IpRuleEntity().mapFromDomain(rule);
} else if (rule instanceof BlackListRule) {
return new BlackListRuleEntity().mapFromDomain(rule);
} else {
throw new IllegalArgumentException("Unexpected argument of type " (rule == null ? "null" : rule.getClass().getName()));
}
}
}
uj5u.com熱心網友回復:
您可以使用類似訪問者模式的東西來實作雙重調度。
在此示例中,它可能如下所示:
public abstract class Rule {
// Maps a rule to a result type T
public interface Mapper<T> {
T mapIpRule(IpRule rule);
T mapBlackListRule(BlackListRule rule);
}
public abstract <T> T map(Mapper<T> mapper);
// ...
}
public class IpRule extends Rule {
@Override
public <T> T map(Mapper<T> mapper) {
return mapper.mapIpRule(this);
}
// ...
}
public class BlackListRule extends Rule {
@Override
public <T> T map(Mapper<T> mapper) {
return mapper.mapBlackListRule(this);
}
// ...
}
public class RuleMapper implements Rule.Mapper<RuleEntity> {
public RuleEntity mapToEntity(Rule rule) {
return rule.map(this);
}
@Override
public RuleEntity mapIpRule(IpRule rule) {
return new IpRuleEntity();
}
@Override
public RuleEntity mapBlackListRule(BlackListRule rule) {
return new BlackListRuleEntity();
}
}
它有一個很好的特性,即編譯時檢查所有子型別都被正確處理。如果Rule之后添加了一個新的子型別,則需要實作該map方法,這將需要向Rule.Mapper介面添加一個方法,這反過來又需要RuleMapper實作來實作該方法。在問題中給出的使用運行時型別檢查的示例中instanceof,可能會遺漏一個案例,從而導致IllegalArgumentException運行時。
但是,您需要判斷額外的復雜性對于您的特定情況是否值得。可能是你現有RuleMapper的就好了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329741.html
上一篇:受保護欄位中的C#內部型別
