NGRX 效果 - Where/How 来组织效果定义。

NGRX Effects - Where/How to organize effect definitions.

我在 angular2 应用程序中使用@ngrx/effects,并且在组织不同的效果定义时遇到困难。

我必须使用实体 IdentitySubscription,每个实体都有自己的操作服务 IdentityActionsSubscriptionActions 以及它们的效果服务 IdentityEffects, SubscriptionEffects.

定义了以下操作。

IdentityActions.AuthorizeIdentity()
IdentityActions.OnIdentityAuthorized(identity)
SubscriptionActions.GetSubscriptionList(identity)
SubscriptionACtions.OnSubscriptionsListed(subscriptions)

身份获得授权后,我立即想获得它的订阅列表。 @ngrx/effects 如何提倡组织这些影响,以便 traceable/easy-to-find 以后(例如,一年后)?

在 IdentityEffects 中:

@Effect()
this._actions.ofType(authActions.AUTHORIZE_IDENTITY))
  .switchMap(() => this.svc.AsyncAuth())
  .switchMap((identity) => authActions.OnIdentityAuthorized(identity))

@Effect()
this._actions.ofType(authActions.ON_IDENTITY_AUTHORIZED)
  .switchMap((identity) => Observable.of(action, subActions.GetSubscriptionList(identty)) 

这在编写时看起来很自然,因为获取订阅列表是身份获得授权的结果...但我很担心,因为如果开发人员试图追踪获取订阅列表的位置从,在 IdentityService 中挖掘是不直观的。

另一种方法是在 CustomerEffects 中注册一个不发出的第二个效果..

@Effect({emit: false})
this._actoions.ofType(authActions.ON_IDENTITY_AUTHORIZED)
  .switchMap((identity) => Observable.of(action, subActions.GetSubscriptionList(identity)) 

这似乎在长篇中更容易找到运行...但是写起来感觉不太自然(我在订阅服务中写了一个身份副作用...)

什么是经得起时间考验的方法(如果有足够的时间)?

这里并没有很多很好的反馈,但我想跟进我的方向。

我认为按受影响的实体而不是造成效果的原因对效果进行分组最有意义。

95% 的情况下,这会导致效果服务定义只属于一个实体……但在某些情况下,可能会有一个或两个效果引用其他内容。

在我的示例中,身份已通过身份验证,这会导致订阅被加载。

IdentityEffectsService.ts

@Effect()
public AuthorizeIdentity$ = this._actions.ofType(AUTHORIZE_IDENTITY)
  .switchMap(() => this._identitySvc.Authorize())
  .map(identity => this._identityActions.OnIdentityAuthorized(identity))

@Effect()
Public OnIdentityAuthorized$ = this._actions.ofType(ON_IDENTITY_AUTHORIZED)
  .do(identity => console.log(`${identity.name}` logged in!`));

SubscriptionActionsService.ts

@Effect() ListSubscriptions$ = this._actions.ofType(LIST_SUBSCRIPTIONS)
  .map(action => <Identity>action.payload)
  .switchMap(identity=> this._subscriptionSvc.List(identity))
  .map((subs) => this._subscriptionActions.OnSubscriptionsListed(subs))

@Effect() OnSubscriptionsListed$ = this._actions.ofType(ON_SUBSCRIPTIONS_LISTED)
  .do(action => console.log(`${action.payload.length} subscriptions listed.`)

/ * This was the effect in question.
    I've grouped it with the other subscription effects because I believe it
    will be more natural for someone trying to understand how subscriptions
    get filled to find it here in the future. 
*/
@Effect() OnIdentityAuthorized$ = this._actions.ofType(ON_IDENTITY_AUTHORIZED)
  .switchMap(identity => this._subscriptionActions.ListSubscriptions(identity))

显然,仍然希望有人在 medium/large 项目中对 @Effects 模式有更多经验。