Pattern per ottenere da più repository

0

Ho diversi oggetti che implementano un'interfaccia e diversi repository che eseguono operazioni CRUD su questi oggetti.

Mi è stato assegnato un GUID e non so quale classe sia l'oggetto, ma è in uno di essi e sto usando il repository per ottenere l'oggetto dal suo GUID.

I repos restituiscono diversi tipi.

class Obj1 : IInterface
{
}
class Obj2 : IInterface
{
}
class Obj3 : IInterface
{
}


var repo1 = new Repo1();
var repo2 = new Repo2();
var repo3 = new Repo3();

Obj1 obj = repo1.Get(someGuid);
if (obj != null) 
{ 
    // use obj
}
else 
{
     Obj2 obj2 = repo2.Get(someGuid);
     if (obj2 != null) 
     { 
         // use obj2
     }
     else 
     {
         Obj3 obj3 = repo3.Get(someGuid); 
         if (obj3 != null) 
         { 
             // use obj3
         }
         else 
         {
             // Check another repository
         }
     }
}

Questo diventa più noioso quando più oggetti implementano quell'interfaccia.

C'è uno schema per questo o per un modo più bello di farlo?

    
posta Graham 21.02.2018 - 11:35
fonte

1 risposta

1

Risposta V2, in base alle informazioni aggiuntive fornite.

Poiché Repo1 , Repo2 ecc tutti hanno un Get che restituisce un IInterface , allora puoi usare Func delegati e linq per semplificare questo:

var repo1 = new Repo1();
var repo2 = new Repo2();
var repo3 = new Repo3();

var repoGetters = new List<Func<GUID, IInterface>>
{
    repo1.Get,
    repo2.Get,
    repo3.Get
};

var obj = repoGetters.First(func => func(someGuid) != null);

obj sarà quindi di tipo IInterface .

Quanto sopra presuppone una corrispondenza è garantita. In caso contrario, sostituisci First con FirstOrDefault e prova obj per null per verificare se si è verificata una corrispondenza.

    
risposta data 21.02.2018 - 11:49
fonte

Leggi altre domande sui tag