2017-03-08 3 views
0

Ich benutze @ ngrx/effects in einer angular2-Anwendung und kämpfe mit der Organisation der verschiedenen Effektdefinitionen.NGRX Effekte - Wo/Wie man Effektdefinitionen organisiert.

ich Entitäten, Identity und Subscription, die jeweils mit ihren eigenen Aktionen Dienstleistungen IdentityActions, SubscriptionActions, sowie die Auswirkungen Dienste IdentityEffects, SubscriptionEffects.

Die folgenden Aktionen sind definiert.

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

Nachdem eine Identität autorisiert wurde, möchte ich sofort eine Liste ihrer Abonnements erhalten. Wie befürwortet @ngrx/effects die Organisation dieser Effekte, so dass es später nachvollziehbar/einfach zu finden ist (z.B. in einem Jahr)?

In 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)) 

Dies scheint natürlich, wenn es zu schreiben, weil die Liste Abonnement immer eine Wirkung einer Identität ist immer berechtigt, ... aber ich bin besorgt, weil wenn ein Entwickler jemals versucht, Wenn Sie herausfinden, von wo die Subskriptionsliste abgerufen wird, ist es nicht intuitiv, im IdentityService herumzugrasen.

Die Alternative ist ein zweiter Effekt in CustomerEffects zu registrieren, die nicht emittieren nicht ..

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

Dies scheint, wie es einfacher wäre, auf lange Sicht zu finden ... Aber fühlt sich weniger natürlich beim Schreiben es (Ich schreibe einen Identitätsnebeneffekt im Abonnement-Service ...)

Was ist der bewährte Ansatz (wenn es überhaupt genug Zeit gibt)?

+1

Haben Sie sich ihre [Beispiel-App] angesehen (https://github.co m/ngrx/Beispiel-App)? – cgatian

+0

Es ist nicht klar, was einige dieser Schnipsel tun. Zum Beispiel, was ist "Aktion" im letzten Ausschnitt? Die Aktion, die den Effekt ausgelöst hat? Wenn ja, warum es wieder emittieren? Es wäre bereits an die Reduzierungen weitergegeben worden.Und wenn 'GetSubscriptionList' einen Zustand aktualisiert, der einen anderen Mechanismus als eine ausgeführte Aktion verwendet, ist das, was Sie tun, nicht länger Redux. – cartant

+0

Ich hatte den Eindruck, dass meine Servicenamen ziemlich Standard waren. UnterAktionen ist eine Klasse, die Methoden verfügbar macht, die Aktionen im Zusammenhang mit Abonnements für den Informationsspeicher ausgeben. Es enthält auch Konstanten für die Auflösung des Aktionstyps. Der letzte Effekt löst zwei Aktionen aus, die eine, die abgefangen wurde (so dass die Identität auf den Status angewendet wird) und eine zweite, die eine "GetSubscriptionList" -Aktion ausgibt. Die Frage, denke ich jedenfalls, ist ziemlich klar. Was ist die beste Vorgehensweise zum Registrieren eines Effekts außerhalb des primären Ressourcenbereichs einer Datei? –

Antwort

1

Nicht wirklich eine Tonne tolles Feedback hier, aber ich möchte mit der Richtung, die ich ging, folgen.

Ich entschied, dass es am sinnvollsten ist, Effekte nach der betroffenen Entity zu gruppieren und nicht nach dem, was den Effekt verursacht.

In 95% der Fälle ergibt dies eine Effekt-Service-Definition, die sich auf genau eine Entität bezieht ... In einigen Fällen können jedoch ein oder zwei Effekte auf etwas anderes verweisen.

In meinem Beispiel ist eine Identität authentifiziert, und das verursacht Abonnements geladen werden.

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)) 

Offensichtlich würde gerne noch jemand mit dem @Effects Muster auf mittlere/große Projekte mit mehr Erfahrung haben Gong in.

Verwandte Themen