Sto costruendo un'integrazione middleware che estrarrà gli ordini da varie API di terze parti e invierà tali ordini nel nostro sistema, oltre a sincronizzare le scorte e inviare le spedizioni. Voglio creare questo in modo tale da poter aggiungere vari rivenditori in un secondo momento senza dover modificare il progetto Core
.
L'ho creato in alcuni progetti:
- Comune (solo cose comuni come WebClient, Serialization, IO ecc.)
- ERP (questo è l'ERP su cui inseriremo questi dati e questo ha tutti i modelli e servizi per inviare ordini, ecc.)
- Core (questo si connetterà a un database per ottenere un elenco delle varie integrazioni che sono state impostate, caricare la DLL dei provider e quindi estrarre gli ordini, ecc.)
- Providers.Retailer1 (questi hanno una dipendenza dal progetto
ERP
poiché restituiranno dati come gli ordini nei modelli dall'ERP) - Providers.Retailer2
- Providers.Retailer3
Attualmente, il mio progetto Core
ha un riferimento al progetto sui Provider. Voglio arrivare ad un punto in cui il Core non ha un riferimento difficile a questi provider - forse sono caricati dinamicamente in fase di esecuzione controllando se la classe implementa un'interfaccia. Quindi, in teoria, se vogliamo integrarci con un nuovo rivenditore, dovremmo semplicemente costruire l'implementazione di ottenere ordini / sincronizzare azioni ecc. Questo suona come un approccio sano? Stavo pensando di guardare in MEF per questo, ma non sono ancora sicuro di come sarebbe.
Il mio problema è, è che Retailer1
per esempio ha bisogno di certe configurazioni e servizi come ApiKey
, Username
, Password
ecc. dove come Retailer2
potrebbe richiedere diversi dati di configurazione. Attualmente, il progetto Core
è ciò che recupererà questi dettagli dal database. Qual è il modo migliore per passare a Providers
? Devo creare un oggetto Configuration
che sia fondamentalmente una coppia chiave / valore della configurazione e programmare l'interfaccia per accettare un oggetto Configuration
? E memorizzare questi valori in una coppia chiave / valore in una tabella di database invece di colonne come sono attualmente?
Attualmente creo le dipendenze all'interno del progetto Core
, tuttavia ciò significa che il progetto Core
è strettamente accoppiato con Retailer1
ad esempio:
TheIconic.Services.IApiService iconicApiService = new TheIconic.Services.TheIconicApiService(
DependencyContainerProvider.Current.Container.Resolve<IWebClient>(),
instance.IntegrationPartner.ApiUrl,
instance.IntegrationPartner.ApiKey,
instance.IntegrationPartner.Username,
instance.IntegrationPartner.BasicAuthUsername,
instance.IntegrationPartner.BasicAuthPassword
);