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?
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
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.