Utilizzo del repository tra il modello EF e il codice del consumatore

2

Ho dati binari nel mio database che dovrò convertire in bitmap ad un certo punto. Stavo pensando se sia appropriato o meno utilizzare un repository e farlo lì. Il mio consumatore, che è un livello di presentazione, utilizzerà questo repository. Ad esempio:

// This is a class I created for modeling the item as is.
public class RealItem
{
    public string Name { get; set; }
    public Bitmap Image { get; set; }
}

public abstract class BaseRepository
{
    //using Unity (http://unity.codeplex.com) to inject the dependancy of entity context.
    [Dependency]
    public Context { get; set; }
}

public calss ItemRepository : BaseRepository
{
    public List<Items> Select()
    {
        IEnumerable<Items> items = from item in Context.Items select item;
        List<RealItem> lst = new List<RealItem>();
        foreach(itm in items)
        {
            MemoryStream stream = new MemoryStream(itm.Image);
            Bitmap image = (Bitmap)Image.FromStream(stream);
            RealItem ritem = new RealItem{ Name=item.Name, Image=image };
            lst.Add(ritem);
        }

        return lst;
    }
}

Questo è un modo corretto di utilizzare il modello di repository? Sto imparando questo modello e ho visto molti esempi online che stanno usando un repository ma quando ho guardato il loro codice sorgente ... per esempio:

public IQueryable<object> Select
{
    return from q in base.Context select q;
}

Come puoi vedere, nessun comportamento viene aggiunto al sistema dal loro approccio, quindi ero confuso dal fatto che forse il repository fosse un'altra cosa e ho sbagliato tutto. Alla fine ci dovrebbero essere ulteriori vantaggi nell'usarli correttamente?

    
posta jim 31.03.2012 - 18:06
fonte

3 risposte

1

Vorrei lasciare il campo Immagine nell'entità come byte [] e aggiungere una nuova proprietà chiamata ImageObject che restituisce il byte Image [] in un oggetto Image appropriato.

public class RealItem
{
    public string Name { get; set; }
    public byte[] Image { get; set; }
    public Bitmap ImageObject
    {
        get
        {
            using(MemoryStream stream = new MemoryStream(this.Image))
            {
                 Bitmap image = (Bitmap)Image.FromStream(stream);
                 return image;
            }
        }
    }
}

Sentitevi liberi di migliorare questo aggiungendo una sorta di funzionalità di memorizzazione nella cache per convertire i byte immagine una volta invece di ogni chiamata (e rinnovare l'oggetto immagine solo se i byte sono stati modificati).

    
risposta data 01.04.2012 - 12:51
fonte
0

Ci sono diversi potenziali vantaggi di un modello di repository, specialmente se lo si imposta come un'interfaccia che può facilmente utilizzare l'iniezione di dipendenza. Ho notato che nel tuo esempio viene iniettato solo il contesto, potresti cambiarlo per consentire l'iniezione del repository stesso.

  • Può aiutare l'unità a testare gli altri livelli isolando l'accesso ai dati per consentire di prendere facilmente in giro il repository in modo che i test dell'unità non siano dipendenti dal repository.
  • Può essere usato per applicare determinati metodi e coerenza di accesso al tuo repository. Ad esempio, in un'applicazione multi-tenancy, si consiglia di assicurarsi che l'ID titolare sia sempre passato piuttosto che consentire l'accesso diretto al contesto per aiutare a rafforzare la sicurezza.
  • Riduce la duplicazione del codice negli altri livelli.
  • Scollega il repository dagli altri livelli in modo che il repository stesso possa essere facilmente modificato in un secondo momento.

Alcuni degli stessi obiettivi possono essere soddisfatti con un livello di servizio di business logic, dipende dalle esigenze della tua applicazione.

    
risposta data 29.08.2012 - 15:13
fonte
0

Questo è esattamente il valore aggiunto che un Repository può dare al di sopra e al di là delle operazioni standard di crud. Tuttavia, vorrei approfittare delle operazioni posticipate. Invece di List, restituisci IEnumerable (o anche IQueryable che consentirà al consumatore di filtrarlo ancora di più) e invece di foreaching restituisci il realitem dal selettore in questo modo

public IQueryable<RealItem> Select()
{
   return Context.Items.Select(item=>
   {
      Bitmap image;
      using(MemoryStream stream = new MemoryStream(item.Image))
      {
         image = (Bitmap)Image.FromStream(stream);
      }
      return new RealItem{Name=item.Name, Image=image};

   });
}

L'altra opzione è come qualcun altro menzionato, fornire una seconda proprietà su RealItem che esegue la conversione da bytearray a bitmap per te.

    
risposta data 28.09.2012 - 17:04
fonte

Leggi altre domande sui tag