Pattern di repository e Iniezione di dipendenza senza un ORM

3

Voglio implementare il modello di repository in un vecchio progetto precedente.

Ho già fatto alcune ricerche e ho scoperto che, senza un ORM, è completamente accettabile avere metodi come "GetBySpecialProperty" e saltare la creazione di un repository generico.

La mia configurazione attuale è:

public class FooRepository
{
    private IMapper<Foo> _fooMapper;

    public FooRepository (IMapper<Foo> mapper)
    {
        _fooMapper = mapper;
    }

    public List<Foo> GetBySpecialProperty(int specialProperty)
    {
        var result = new List<Foo>();
        //retrieve datareader
        while (reader.Read()) result.Add(_fooMapper.Map(reader));
        return result;
    }
}

Il mio problema ora è: Mi piacerebbe davvero avere un'interfaccia per questa classe ed essere in grado di iniettarla in business class (per testare e ridurre l'accoppiamento), ma è sbagliato avere un'interfaccia IFooRepository solo per quel metodo. Inoltre, non so davvero come creare una factory per i miei repository, poiché il chiamante dovrebbe conoscere i metodi speciali all'interno del repository che desidera.

PS: per accedere ai dati Attualmente sto usando OleDb e passare a un ORM non è un'opzione, poiché il resto del team non sa come usarli.

Altre domande su SE ho già consultato: link link

    
posta BgrWorker 19.03.2016 - 08:25
fonte

2 risposte

1

Sembra che tu voglia mescolare due pattern, il 'repository generico' e il 'repository normale'

se hai

IRepository
{
    List<Foo> GetFoosByDate(DateTime date);
    List<Foo> GetFoosById(string Id);
}

va bene e alcuni direbbero meglio di

IRepository<T>
{
   List<T> GetThings(IQueryObject query);
}

Come la prima specifica le query consentite.

Tuttavia, è possibile iniettare il repository specifico in un wrapper generico e generare eccezioni solo quando la query non corrisponde a una delle query consentite.

    
risposta data 19.03.2016 - 12:28
fonte
1

Non c'è niente di sbagliato nella creazione di un'interfaccia per un metodo. Le cose importanti che ottieni sono:

  1. Separazione delle preoccupazioni. Questo è il codice di accesso ai dati e appartiene alla sua classe.

  2. Segregazione dell'interfaccia. Usando un'interfaccia puoi esporre il codice precedentemente non testabile ai test unitari.

Queste sono le tue grandi vincite che giustificano un'interfaccia con un singolo metodo.

I really don't know how I would make a factory for my repositories, as the caller would have to know the special methods inside the repository he wants.

È necessario organizzare i repository attorno a una singola tabella nel database e qualsiasi informazione ausiliaria relativa a quella tabella che viene comunemente utilizzata insieme ai dati di quella tabella. La classe factory deve solo restituire qualcosa che implementa l'interfaccia. La fabbrica stessa dovrebbe avere la sua interfaccia in modo da poterla inserire in un altro codice.

    
risposta data 19.03.2016 - 14:36
fonte

Leggi altre domande sui tag