Come si dovrebbe implementare l'iniezione delle dipendenze per un client di geocoding che aggrega diverse implementazioni dei provider di coordinate?

1

Sono nuovo in DI e vorrei sapere come utilizzare DI per risolvere questo problema.

Se ho un ILatLongLocation che implementa un Latitude e Longitude , allora dato due di questi posso produrre un Distance usando una varietà di algoritmi, ma posso anche ragionevolmente sceglierne uno come algoritmo "migliore" in fase di progettazione senza perdita di sonno.

Tuttavia, poiché gli utenti inseriranno raramente le coordinate fisiche, potrei dover confrontare i codici postali o qualcosa di simile.

Ora, per risolvere i codici di avviamento postale con le coordinate, potrei applicare un algoritmo ingenuo che utilizza la concatenazione delle stringhe, ecc. per fare un'ipotesi approssimativa sulle coordinate fisiche, potrei scegliere un insieme casuale di coordinate, ecc. con ogni probabilità, avrò bisogno di risolvere i codici di avviamento postale usando una sorta di mappatura dei codici postali per le coordinate.

Quindi, essendo nuovo a DI, vorrei sapere se quanto segue è una ragionevole applicazione di DI e / o se lo sto pensando troppo.

ILocatable ha ILatLongLocation

ILocatableProvider<T> : ILocatable ha un T RawLocatable e può restituire un ILatLongLocation .

IZipCodeLocatableProvider : ILocatableProvider<string> ha un string RawLocatable e restituisce un ILatLongLocation .

NaiveZipCodeLocatableProvider è un'implementazione che utilizza solo modelli in codici postali noti per fornire un'ipotesi ottimale in merito alle coordinate.

DbZipCodeLocatableProvider è un'implementazione che utilizza un database (magari attraverso un DbContext o in qualche modo altro) per restituire le coordinate.

Ora DbZipCodeLocatableProvider deve dipendere da qualche tipo di repository o contesto o connessione o qualcosa per accedere a un database (a meno che non sia letteralmente codificato) ... quindi questo significa che ho bisogno di avere un DbContext o qualcosa di simile ... ecco dove mi perdo.

Sto pensando a questo nel modo giusto? Si tratta di uno scenario legittimo per l'iniezione di dipendenza? E come faccio a discriminare, diciamo diverse stringhe di connessione e diverse strategie per risolvere i codici postali in coordinate?

Modifica: ... e non dimenticare di WebServiceZipCodeLocatableProvider ... c'è un'altra opzione (realistica).

    
posta tacos_tacos_tacos 30.06.2014 - 12:02
fonte

2 risposte

3

Implementerei solo l'integrazione delle dipendenze per un client di geocodifica che aggrega diverse implementazioni dei provider di coordinate se si

  • avere più di un provider (ad esempio la posizione in base all'indirizzo ip al posto del codice postale)
  • o fai Test-driven_development .

Per me il tuo design sembra troppo complicato.

Ho implementato qualcosa di simile per Android usando Test-driven_development e tutto ciò di cui avevo bisogno era

  • un LatLongLocationCalculationService in grado di elaborare ILatLongLocation (ad esempio, calcola la distanza tra le posizioni)
  • a ZipCodeLatLongAdapter che consente ai codici Zip di apparire come ILatLongLocation.

Un dettaglio di implementazione per ZipCodeLatLongAdapter è che cerca la posizione di un codice postale dal database.

    
risposta data 30.06.2014 - 13:45
fonte
0
ILatLongLocation
{
    double Latitude;
    double Longitude;
}

ILocatable
{
    ILatLongLocation GeoCoordinate;
}

Ok, sembra ragionevole finora. Probabilmente cambierei i nomi un po ', ma è solo una preferenza.

ILocatableProvider<T> : ILocatable

Mi hai perso qui. Consente forse di specificare nei termini più semplici ciò che è necessario per il servizio da eseguire. Da quello che posso capire, vuoi che un servizio includa un codice postale e ti restituisca una posizione ILatLong. Per metterlo in termini di codice.

IZipToGeoCoords
{
    ILatLongLocation GetGeoCoordsFromZip(string zip);
}

Questo non restituisce ILOCatables, perché ILocatables è esso stesso il contenitore di ILatLongLocations. Questo servizio verrebbe utilizzato da qualunque processo stia creando l'ILOCatable quando le coordinate geografiche devono essere derivate da un codice postale.

ILocatable objectWithGeoCoordinates = new GeoCoordinateWrapperThingy();
objectWithGeoCoordinates.GeoCoordinate = injectedIZipToGeoCoordsService.GetGeoCoordsFromZip(aZipCode);

Il resto di ciò che citi, in particolare la parte relativa al contesto DB, sembra che tu voglia incapsulare la creazione di ILocatables insieme alla creazione di ILatLongLocations. Ma per creare un ILOCatable da un codice postale in primo luogo, per prima cosa è necessario un servizio per ricavarlo.

In qualsiasi momento stai prendendo il tuo oggetto che ha un codice di avviamento postale, e vuoi convertirlo in una versione di se stesso che implementa ILocatable, qualunque cosa stia facendo è necessaria la costruzione del costruttore di servizi IZipToGeoCoords.

    
risposta data 30.06.2014 - 18:10
fonte

Leggi altre domande sui tag