Angular 使用ngrx创建可重用的效果类?

Angular 使用ngrx创建可重用的效果类?,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,我试图在我的NgRx Angular 6应用程序中重用common。目前,我提取了一个EffectBuilder服务,帮助创建效果实现。但我想进一步减少重复代码。是否可以在没有声明性的@Effect()装饰器或其他方式的情况下动态构建和注册效果 下面是我拥有的两个效果类的示例,我的应用程序中每个模块一个。除了传递给buildEffectX()方法的一些配置数据外,它们基本相同: 模块1效果等级: @Injectable() 导出类Module1效果{ 构造函数(私有存储:存储,私有效应构建器:M

我试图在我的NgRx Angular 6应用程序中重用common。目前,我提取了一个EffectBuilder服务,帮助创建效果实现。但我想进一步减少重复代码。是否可以在没有声明性的
@Effect()
装饰器或其他方式的情况下动态构建和注册效果

下面是我拥有的两个效果类的示例,我的应用程序中每个模块一个。除了传递给
buildEffectX()
方法的一些配置数据外,它们基本相同:

模块1效果等级:

@Injectable()
导出类Module1效果{
构造函数(私有存储:存储,私有效应构建器:MyEffectsBuilder){}
@效果()
effect1$:Observable=this.effectsBuilder.buildEffect1(this.store,“Module1”);
@效果({dispatch:false})
effect2$:Observable=this.effectsBuilder.buildEffect2(this.store,“Module1”);
@效果()
effect3$:Observable=this.effectsBuilder.buildEffect3(this.store,“Module1”);
}
模块2效果等级:

@Injectable()
导出类模块2效果{
构造函数(私有存储:存储,私有效应构建器:MyEffectsBuilder){}
@效果()
effect1$:Observable=this.effectsBuilder.buildEffect1(this.store,“Module2”);
@效果({dispatch:false})
effect2$:Observable=this.effectsBuilder.buildEffect2(this.store,“Module2”);
@效果()
effect3$:Observable=this.effectsBuilder.buildEffect3(this.store,“Module2”);
}

如果可能的话,我想进一步简化这个样板。这里有前进的道路吗?
@Effect()
的声明性质是否意味着我必须这样做?

让我问你,为什么需要创建可重用的效果?我相信通过组合可以实现你所需要的,因为我的应用程序有多个延迟加载的模块,它们可以做很多类似的事情。例如,我可能有一个books模块,其中有一个对books运行报告的效果。然后我可能会有一个SocksModule,它会运行一个关于socks的报告。在每个模块中,模式都是相同的,一种截取常见操作类型(如RunReportAction)然后调用API的效果。然后,效果会发送一个带有结果的操作(ReportResultsReadyAction)。我们有非常相似的横切功能,如加载注释或不同类型组件的附件。实现它的最佳方法是发布另一个操作,如
RunReportAction(reportType,correlationId:guid)
,然后等待响应。你可以在这里读到这种模式
@Injectable()
export class Module1Effects {

    constructor(private store: Store<AppState>, private effectsBuilder: MyEffectsBuilder) { }

    @Effect()
    effect1$: Observable<Action> = this.effectsBuilder.buildEffect1(this.store, "Module1");

    @Effect({ dispatch: false })
    effect2$: Observable<Action> = this.effectsBuilder.buildEffect2(this.store, "Module1");

    @Effect()
    effect3$: Observable<Action> = this.effectsBuilder.buildEffect3(this.store, "Module1");
}
@Injectable()
export class Module2Effects {

    constructor(private store: Store<AppState>, private effectsBuilder: MyEffectsBuilder) { }

    @Effect()
    effect1$: Observable<Action> = this.effectsBuilder.buildEffect1(this.store, "Module2");

    @Effect({ dispatch: false })
    effect2$: Observable<Action> = this.effectsBuilder.buildEffect2(this.store, "Module2");

    @Effect()
    effect3$: Observable<Action> = this.effectsBuilder.buildEffect3(this.store, "Module2");
}