Ho una collezione di classi cooperative i cui comportamenti sono interdipendenti l'uno con l'altro. Ma desidero mantenerli accoppiati liberamente, quindi ho creato interfacce appropriate.
Voglio determinare un modello appropriato per istanziare implementazioni specifiche di questi oggetti.
Ecco uno schema delle loro interdipendenze:
-
IService : IDisposable
: ascolta i messaggi; espone un metodoListen
che:- chiama
IMessageClient.GetNextMessage
iterativamente - richiama un (delegato che crea una?) nuova istanza
IMessageHandler
in una nuova discussione per ogni messaggio - fino a
NumberOfThreads
di thread simultanei
- chiama
-
IServiceMonitor<IService>
: controlla il servizio:- espone il metodo
Start
che richiamaIService.Listen()
- espone il metodo
Stop
che disponeIService
- espone i metodi
Pause
eResume
che rispettivamente azzerano o azzeranoIService.NumberOfThreads
- chiama
CreateRemoteConfigClient()
per ottenere un client ogni 90 secondi, quindiIRemoteConfigClient.GetConfig
- notifica eventuali modifiche di configurazione a
IMessageClient
,IService
e qualsiasiIMessageHandler
successivo
- espone il metodo
-
%codice%; espone
IMessageClient : IDisposable
quale:- esegue il polling lungo una coda di messaggi per la richiesta successiva
-
%codice%; espone
GetNextMessage
quale:- fa qualcosa con il messaggio, richiedendo sulla strada ulteriori
IMessageHandler : IDisposable
s daHandleMessage
per accedere ad altri servizi
- fa qualcosa con il messaggio, richiedendo sulla strada ulteriori
-
%codice%; espone
IXyzClient
quale:- recupera qualsiasi override remoto dello stato di configurazione corrente
Questo mi ha portato a creare:
-
%codice%; con i seguenti membri:
-
IFactory
: restituisce un nuovoIRemoteConfigClient : IDisposable
-
GetConfig
: restituisce ilIFactory
creato per accompagnare il più recenteCreateMonitor
o un nuovoIServiceMonitor<IService>
- NB: un servizio dovrebbe poter essere ottenuto senza che sia stato creato un monitor
-
GetService
: restituisce un nuovoIService
- In entrambi:
-
IServiceMonitor
: restituisce unIService
-
CreateMessageClient
: crea unIMessageClient
e invocaCreateMessageHandler
-
-
new IMessageHandler
: restituisce unMessageHandlerDelegate
-
Le implementazioni delle interfacce principali accettano new IMessageHandler
nei loro costruttori.
Questo è così:
-
HandleMessage
può chiamareCreateRemoteConfigClient
per ottenere un singolonew IRemoteConfigClient
che saràIFactory
quando è fatto -
IService
può chiamareCreateMessageClient()
per consentirgli di coordinare e monitorareIMessageClient
-
Dispose
può riportare i suoi progressi indietro tramiteIServiceMonitor
GetService()
, ovviamente, è iniziato apparentemente come un'implementazione del pattern Factory, quindi ha iniziato a inclinarsi maggiormente verso un pattern Builder, ma in realtà nessuno di questi sembra giusto.
Sono IService
-ing alcuni oggetti, IMessageHandler
-tando gli altri, e certe cose, come il fatto che una successiva chiamata a IMessageClient
modificherà il risultato di IFactory
, solo che non va bene.
Qual è la convenzione di denominazione giusta per una classe che coordina tutti questi altri, E c'è un modello effettivo che può essere seguito, sono troppo ingegnerizzato o sto sovra-analizzando?!