Angular NGRX效果-在何处/如何组织效果定义。

Angular NGRX效果-在何处/如何组织效果定义。,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,我正在angular2应用程序中使用@ngrx/effects,并且正在努力组织不同的效果定义 我必须创建实体,Identity和Subscription,每个实体都有自己的操作服务IdentityActions,SubscriptionActions,以及它们的效果服务IdentityEffects,SubscriptionEffects 定义了以下操作 IdentityActions.AuthorizeIdentity() IdentityActions.OnIdentityAuthoriz

我正在angular2应用程序中使用@ngrx/effects,并且正在努力组织不同的效果定义

我必须创建实体,
Identity
Subscription
,每个实体都有自己的操作服务
IdentityActions
SubscriptionActions
,以及它们的效果服务
IdentityEffects
SubscriptionEffects

定义了以下操作

IdentityActions.AuthorizeIdentity()
IdentityActions.OnIdentityAuthorized(identity)
SubscriptionActions.GetSubscriptionList(identity)
SubscriptionACtions.OnSubscriptionsListed(subscriptions)
在一个身份被授权后,我立即想要得到它的订阅列表。
@ngrx/effects
如何宣传这些效果的组织,以便在以后(例如一年后)可以追踪/容易找到

在标识效果中:

@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

SubscriptionActionsService.ts

@Effect()ListSubscriptions$=this.\u actions.ofType(列表订阅)
.map(action=>action.payload)
.switchMap(identity=>this.\u subscriptionSvc.List(identity))
.map((subs)=>此._subscriptionActions.OnSubscriptionsListed(subs))
@Effect()OnSubscriptionsListed$=this.\u actions.of type(ON\u SUBSCRIPTIONS\u LISTED)
.do(action=>console.log(列出了`${action.payload.length}订阅)
/*这就是所讨论的效果。
我将它与其他订阅效果分组,因为我相信它
对于试图了解订阅方式的人来说更自然
在这里找到它在未来的填充。
*/
@Effect()OnIdentityAuthorized$=this.\u actions.of type(在\u IDENTITY\u AUTHORIZED上)
.switchMap(identity=>this.\u subscriptionActions.ListSubscriptions(identity))

显然,我还是希望有人能在中/大型项目中对@Effects模式有更多的经验。

你看过他们的吗?不清楚这些片段中的某些片段是做什么的。例如,最后一个片段中的
动作是什么?触发效果的动作?如果是,为什么重新发射它?它已经有了如果
GetSubscriptionList
使用调度操作以外的机制更新某些状态,则您所做的不再是重复使用。我的印象是我的服务名称相当标准。subActions是一个类,它公开了向存储区发出与订阅相关的操作的方法。它还包含用于操作类型解析的常量。最后一个效果分派两个操作,一个是它截获的(以便将标识应用于状态),另一个是发出“GetSubscriptionList”的行动。无论如何,我认为问题很清楚。注册文件主要资源范围之外的效果的最佳实践是什么。我已经看过了示例应用程序。它非常简单,他们的关注点都没有可能跨越这样的边界。当有人登录时,副作用是获得li我找不到任何明确的指南来说明这个副作用应该注册在哪里…作为识别效应或订阅效应。
@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!`));
@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))