web-dev-qa-db-fra.com

Avoir un référentiel dépendant d'un autre référentiel

J'ai récemment passé du temps à lire sur les principes SOLID et j'ai décidé de voir comment la base de code avec laquelle je travaille se compare.

Dans certains de nos codes, il existe un référentiel (référentiel A). Lorsqu'un enregistrement doit être supprimé du référentiel A, nous devons également supprimer un enregistrement associé du référentiel B. Le codeur d'origine a donc créé une dépendance à une implémentation concrète du référentiel B. La méthode du référentiel A se trouve dans une transaction et supprime l'enregistrement du référentiel A, puis appelle la méthode du référentiel B pour supprimer les données associées.

Ma compréhension du principe S est que chaque objet ne devrait avoir qu'une seule raison de changer, mais pour mon référentiel A a 2 raisons de changer? Ou suis-je loin de la cible?

29
MrGrumpy

Le référentiel doit avoir une seule responsabilité - persister un type d'entité. Par exemple. employés. Si vous devez supprimer certains enregistrements associés d'un autre référentiel, cela ressemble à de la logique métier. Par exemple.

Lorsque l'employé est renvoyé, nous devons supprimer son journal de travail

Et l'endroit habituel pour la logique métier est un domaine de services. Ce service aura les deux référentiels et fera tout le travail:

staffService.Fire(employee)

La mise en œuvre ressemblera

public class StaffService
{
    private IEmployeeRepository employeeRepository;
    private IWorkLogRepository workLogRepository;
    private IUnitOfWorkFactory uowFactory;

    // inject dependencies

    public void Fire(Employee employee)
    {
        using(var uow = uowFactory.SartNew())
        {
            workLogRepository.DeleteByEmployee(employee.Id);
            employeeRepository.Delete(employee.Id);
            uow.Commit();
        }
    }
}

Donc, les conseils de base

  • essayez de garder votre logique métier en un seul endroit, n'en diffusez pas une partie à l'interface utilisateur, une partie aux référentiels, une partie à la base de données (parfois en raison de problèmes de performances, vous devez faire de la logique côté base de données, mais c'est une exception)
  • ne laissez jamais les référentiels référencer d'autres référentiels, le référentiel est un composant de bas niveau de votre application avec des responsabilités très simples

Vous vous demandez peut-être quoi faire si vous avez un employé et qu'il a un objet imbriqué qui est stocké dans une table de base de données différente. Si vous utilisez cet objet séparément de l'employé, tout est comme ci-dessus - vous devriez avoir un référentiel séparé et un autre objet (service) qui manipule les deux référentiels. Mais si vous n'utilisez pas cet objet imbriqué séparément de l'employé, l'employé est une racine agrégée et vous ne devriez avoir qu'un référentiel d'employé, qui interrogera les deux tables à l'intérieur.

51