2017-06-25 11 views
0

私は、要求 - 応答フローを実装する以下のタイプコードを持っています。以下のタイスクリプトコードをどのようにして実装できますか?

DataRequest - FooDataRequest & BarDataRequestの2つのタイプがあります。

これらの要求タイプには複数のリゾルバがあります。 FooResolverはFooの特定の事柄を行い、バー特定の事柄を行いFooDataResponseとBarResolverを送り返しや送り返すBarDataResponse

abstract class DataRequest{ 
    public type: typeof DataRequest; 
    public payload: string; 
} 
abstract class DataResponse { 
    public data: any; 
} 

class FooDataRequest extends DataRequest { 
    constructor() { 
     super(); 
     this.type = FooDataRequest; 
     this.payload = "foo request"; 
    } 
} 

class BarDataRequest extends DataRequest { 
    constructor() { 
     super(); 
     this.type = FooDataRequest; 
     this.payload = "foo request"; 
    } 
} 

class FooDataResponse extends DataResponse { 
    constructor() { 
     super(); 
     this.data = "foo response"; 
    } 
} 
class BarDataResponse extends DataResponse { 
    constructor() { 
     super(); 
     this.data = "bar response"; 
    } 
} 

abstract class DataResolver { 
    abstract resolve(request:DataRequest): DataResponse 
} 

class FooViewResolver extends DataResolver { 
    public resolve(reportRequest:FooDataRequest): FooDataResponse { 
     return new FooDataResponse(); 
    } 
} 

class BarViewResolver extends DataResolver { 
    public resolve(dashboardRequest:BarDataRequest): BarDataResponse { 
     return new BarDataResponse(); 
    } 
} 

class ResolverFactory { 
    public static getResolver(request: DataRequest): DataResolver { 
     //If there is 100 request , then so many if else statement 
     //That is not effective 
     if (request.type === FooDataRequest) { 
      return new FooViewResolver(); 
     } 
     else if (request.type = BarDataRequest) { 
      return new BarViewResolver(); 
     } 
    } 
} 



const request :DataRequest = new FooDataRequest(); 
const resolver: DataResolver = ResolverFactory.getResolver(request); 
console.log(resolver); 
const response: DataResponse = resolver.resolve(request); 
console.log(response); 

リゾルバの工場を実施するための最良の方法は何ですか?私は100の要求の種類があれば、適切なリゾルバを識別するために複数のif文を持つでしょう。 またはこの問題を設計するより良い方法はありますか? @plalxコメントに続いて

+0

SOそれがコードレビューのウェブサイトではありません。 :)それのための他のフォーラムがあります。 :) – toskv

+0

リゾルバを工場に登録するだけで、内部マップを使用してリゾルバとリクエストタイプをリンクすることができます。 – plalx

答えて

0

は、ここでの例です:

class ResolverFactory { 
    private static readonly resolvers: Map<typeof DataRequest, DataResolver> = new Map([ 
     [FooDataRequest, new FooViewResolver()], 
     [BarDataRequest, new BarViewResolver()] 
    ]); 

    public static getResolver(request: DataRequest): DataResolver { 
     let resolver: DataResolver | undefined = ResolverFactory.resolvers.get(request.type); 
     if (!resolver) { 
      throw new Error(`Resolver for '${String(request.type)}' not found`); 
     } 
     return resolver; 
    } 
} 
関連する問題