L'unità di lavoro dovrebbe creare un repository?

4

La nostra classe "unità di lavoro" ha un metodo che accetta un tipo di classe e crea un repository:

public IRepository<TEntity> GetRepository<TEntity>() where TEntity : class
        {
            var repoItem = _repositoryList.FirstOrDefault(cv => cv.GetType().IsGenericType && cv.GetType().GetGenericArguments()[0] == typeof(TEntity));
            if (repoItem == null)
            {
                repoItem = new Repository<TEntity, object>(Context);
                _repositoryList.Add(repoItem);
            }
            return repoItem as IRepository<TEntity>;
        }

Per me, sembra molto strano perché l'unità di lavoro non è DI.

Ho cercato di spiegarlo al mio team, ma dicono sempre "tutti gli esempi di unità di lavoro contengono classi concrete o proprietà / metodi che possono creare e restituire repository".

Ma la mia opinione su una "unità di lavoro" è, dovrebbe sapere solo quali repository esistono, e quando chiamo Savechanges , dovrebbe salvare le entità in tutti questi repository.

Ora i nostri fornitori di servizi accettano solo UnitOfWork , ma la mia opinione è che dovrebbe prendere anche le interfacce del repository. Perché UnitOfWork non dovrebbe essere una classe di Dio che può fare qualsiasi cosa.

Hai qualche buona spiegazione del perché è sbagliato \ giusto?

    
posta Mediator 05.07.2018 - 23:19
fonte

1 risposta

5

Il problema immediato che vedo qui diventa difficile testare unitamente "UnitOfWork" con repository finti. Cosa succede se la linea

    repoItem = new Repository<TEntity, object>(Context);

deve essere sostituito da ... new MockRepository per un test significativo?

Quindi nel caso in cui UnitOfWork necessiti solo di uno o due, forse 3 repository, potresti provare a iniettarli nel costruttore UnitOfWork . Se ha bisogno di più, ma i repository possono essere istanziati in anticipo, puoi anche provare a iniettare in anticipo il _repositoryList riempito, senza estenderlo in UnitOfWork .

Tuttavia, se il tuo UnitOfWork è davvero così complesso, è necessario utilizzare molte classi di repository diverse e la creazione dei repository dovrebbe essere eseguita solo "su richiesta" (come mostrato nel tuo esempio), quindi proverei quanto segue : crea una nuova classe RepositoryFactory che incapsula _repositoryList , refactor GetRepository in questa nuova classe e inietta un oggetto di tipo IRepositoryFactory in UnitOfWork . Ciò ti dà la necessaria separazione delle responsabilità e consentirà di iniettare un MockRepositoryFactory per un test unitario.

    
risposta data 06.07.2018 - 08:10
fonte