【问题标题】:Clear architecture principle in Angular (Bob Martin)?清晰的 Angular 架构原则 (Bob Martin)?
【发布时间】:2020-07-22 21:43:03
【问题描述】:

我正在尝试遵循架构 Bob 的叔叔原则。主要概念是外层取决于内层,但并非如此。

所以,我的顶层是发出 http 请求的服务:

export class ApplicationService {
    constructor(private http: HttpClient, private applicationAdapter: ApplicationAdapter) {}
     getDetails(id: string): Observable<ApplicationResponse> {
            return this.http.get<Application>(`${environment.apiUrl}/applications?id=${id}`).pipe(
                map((data: any) => {
                    return {
                        application: this.applicationAdapter.adapt(data.application)
                }),
            );
        }
}

在这里我得到响应并将其发送到适配器ApplicationAdapter

@Injectable({
    providedIn: 'root',
})
export class ApplicationAdapter implements Adapter<Application> {
    constructor(private datePipe: DatePipe) {}

    adapt(item: any): Application {
        return new Application(item, this.datePipe)
    }
}

适配器返回具体型号Application

export class Application {
    constructor(
        public statename: string,
        public dt: Date
        public others properties...
        private datePipe: DatePipe,

         getFormattedData(): string {
             return this.datePipe.transform(this.dt);
         } 
}

由于 myt 结果模型 class Application 依赖于 private datePipe: DatePipe 我必须从 ApplicationAdapter 开始传递此依赖项:

   constructor(private datePipe: DatePipe) {}
   return new Application(item, this.datePipe);

然后最终模型Application 让它在方法getFormattedData(): string; 中使用

所以,我认为这是架构违规,因为适配器不应该知道依赖private datePipe: DatePipe。在这种情况下,我的实体(Application)依赖于内部依赖,这违反了原则。

你能解释一下,如何解决这个问题,也许我错了!

【问题讨论】:

    标签: angular architecture


    【解决方案1】:

    如果您想在代码中使用管道,但不将其作为依赖项传递,您可以将公共静态方法添加到管道。这个方法应该包含转换逻辑,transform 方法应该在里面调用你的静态方法。所以管道看起来像:

    @Pipe({ name: 'datePipe' })
    export class DatePipe implements PipeTransform {
      public static apply(date: Date): string {
        return date.toISOString();
      }
      
      transform(value: Date): string {
        return DatePipe.apply(value);
      }
    }
    
    

    getFormattedData 将是:

     getFormattedData(): string {
       return DatePipe.apply(this.dt);
     } 
    

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多