Ukládáná dat aplikace v eventech
- akadlec
- Člen | 1326
Resp. řeším, snažím se vymyslet jak na spolupráci modulů a mezimodulovou datovou výměnu. Konkrétně mám modul co se stará o uživatelské účty a pak mám druhý modul který se stará o správu identit (userpass/fb/twitter atd.) Tento modul identit ale jen zastřešuje to jak se s identitami pracuje, jednotlivé identity zase dodávají jiné moduly, třeba identitu userpass dodává modul uživatelských účtů. A teď potřebuju vyřešit jak modul uživatelských účtů provede aktualizaci identity. Tak mě napadlo že se udělá nějaká data exchange quee kde jednotlivé moduly budou házet své požadavky na práci s daty, třeba ten modul uživatelských účtů tam hodí požadavek na editaci identity XY s hodnotami uživ. jména a hesla. Modul identity si pak šáhne do fronty, resp fronta zavolá ten modul a ten si veme data a provede jejich změnu.
Výsledkem bude odstítění jednotlivých modulů od sebe, takže pokud budu někde jinde potřebovat jiný modul identity, tak jej jednoduše vyměním a nahradím jinou verzí, ale nebudu muset cokoliv měnit v ostatních modulech.
- pata.kusik111
- Člen | 78
Tohle je použitelné pouze v případě, že nepotřebuješ, aby se ta změna zapracovala okamžitě/respektive v rámci toho requestu. RabbitMQ ti není schopen slíbit, kdy se požadavek zpracuje, pouze že se zpracuje.
Pokud potřebuješ změnu okamžitě, tak ravnou na nějaký interface (pokud běží spolu v jedné aplikaci) nebo na nějaké API (pokud spolu neběží). Tak či onak ti jde o vytvoření nějakého komunikačního rozhraní. Což jsou všechny 3 z výše zmiňovaných možností, jen se každá hodí pro něco jiného.
- Svaťa Šimara
- Člen | 98
Oddělení modulů je výborný nápad. To, co zde popisuješ mi připomíná integraci bounded context v Domain driven design.
Můžeš se inspirovat třeba zde: http://culttt.com/…ed-contexts/
Anebo si něco přečíst něco víc (kapitola 13): https://books.google.cz/…_Design.html?…
- pata.kusik111
- Člen | 78
Podívej se například, jak mezi sebou komunikují moduly Nette.
Takový nástřel kódu:
interface IdentityModuleInterface {
public function update(Identity $oldIdentity, Identity $newIdentity);
}
class MyIdentityModule implements IdentityModuleInterface {
public function update(Identity $oldIdentity, Identity $newIdentity) {
//tady si uděláš ty potřebné úpravy identity, co potřebuješ
}
}
No a co se týče modulu Uživ. účtů:
class UserAccountModule {
private $identityModule
public function __construct(IdentityModuleInterface $identityModule) {
$this->identityModule = $identityModule
}
public function changeIdentity() {
$old = //způsob, jakým do teď získáváš současnou identitu
$new = $old->changeSomething();
$this->identityModule->update($old, $new);
}
}
A jak dostaneš ten správný „Identity“ modul do „UserAccount“ modulu?
No v nette třeba nějak takto:
$dependencyContainer->getByType('IdentityModuleInterface')
.
A moduly jednoduše vyměníš v neonu.
Editoval pata.kusik111 (12. 2. 2016 12:53)
- akadlec
- Člen | 1326
@pata.kusik111 hele interfejsy aktuálně mám, ale to bych ty interfejsy musel definovat mimo oba moduly aby se tím získala nezávislost ne? Do modulu pro správu uživatelů si přes DI můžu injecnout službu co spravuje identity ale její interface je definován právě modulu identit, takže by tam ta závislost byla. Leda definici toho interface vytáhnout „nad“ moduly
- pata.kusik111
- Člen | 78
akadlec napsal(a):
@pata.kusik111 hele interfejsy aktuálně mám, ale to bych ty interfejsy musel definovat mimo oba moduly aby se tím získala nezávislost ne? Do modulu pro správu uživatelů si přes DI můžu injecnout službu co spravuje identity ale její interface je definován právě modulu identit, takže by tam ta závislost byla. Leda definici toho interface vytáhnout „nad“ moduly
Ano, definice interface má být „nad“ moduly. Nikdo přece neříká, že současná implementace je ta jediná možná. Pokud to chceš mít ještě o „úrověň“ lepší, podívej se jak jsou v Nette napsané Bridges: Api dokumentace. To je ta fukcionalita, kterou hledáš