Rust의 웹 응용 프로그램으로 Dependency inversion
샘플 코드는 비동기적으로 뉴스를 얻습니다.Usecase, Gateway 및 Port라는 개념을 사용하여 설명합니다.Usecase에는 응용 프로그램 논리를, Gateway에는 외부 API와 데이터 저장소 등에서 되돌아오는 값을 Domain으로 바꾸는 논리를 쓴다.Port는 디테일을 실현하는 추상적인 층에 달려 있다.아래 그림에서 보듯이 Usecase는 Port에 의존하고 Gateway도 Port에 의존한다.
다음은 각 층에 대해 설명한다.
Use case
news_get_usecase에서 뉴스의 ID 일람표를 얻었는데 이 ID를 바탕으로 최신 뉴스 100개를 얻는 응용 프로그램 논리가 기재되어 있다.Usecase는 Gateway의 구체적인 실시 방식을 모르고 실시포트의 일부 존재만 알고 있다.
pub async fn execute(news_port: impl NewsPort) -> Result<NewsList, Error> {
let news_ids = news_port.find_news_ids().await?;
news_port.find_news(news_ids.take_latest(100)).await
}
Port
Usecase와 Gateway가 의존하는 추상 계층입니다.Port 설치는 Gateway 에서 수행합니다.
#[async_trait]
pub trait NewsPort {
async fn find_news(&self, ids: NewsIds) -> Result<NewsList, Error>;
async fn find_news_ids(&self) -> Result<NewsIds, Error>;
}
Gateway
Port 설치를 수행하는 레이어입니다.다음 샘플 코드는 외부 API와 데이터 저장소 등 반환값을 변환하는 논리가 적힌 Gateway를 생략했습니다.이 층 덕분에 역 논리와 응용 프로그램 논리는 응용 프로그램의 외부에 의존하지 않는다.
#[derive(Debug, Copy, Clone)]
pub struct NewsGateway;
#[async_trait]
impl NewsPort for NewsGateway {
async fn find_news(&self, ids: NewsIds) -> Result<NewsList, Error> {
// convert a data format received from external systems to a particular Domain object
}
async fn find_news_ids(&self) -> Result<NewsIds, Error> {
// convert a data format received from external systems to a particular Domain object
}
}
이러한 실현을 통해 의존 관계를 역전시킬 수 있다.전체 코드
최후
다른 API와 데이터 저장소 등 통신 대상이 늘어나면서 의존 대상을 늘리려 해도 Usecase 함수의 매개 변수를 늘리면 의존 관계 자체를 간단하게 유지할 수 있게 됐다.그래서 의존관계를 상당히 간단한 방법으로 역전시킬 수 있다고 생각한다.
Reference
이 문제에 관하여(Rust의 웹 응용 프로그램으로 Dependency inversion), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/takanori/articles/b1013087844bccafd67a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)