как сопоставить класс модели с инфраструктурой с помощью чистой архитектуры

#c# #asp.net-core #clean-architecture

Вопрос:

У меня есть путаница в отношении чистой архитектуры, в моем проекте у меня есть два проекта,один из которых-Инфраструктура,в которой я создаю объекты базы данных и модели,у меня есть основной проект,в котором я создал свои интерфейсы и свои модели,интерфейсы внутри ядра встроены в инфраструктуру, например, в моем основном проекте у меня есть класс IDataHandler, я помещаю все обозначения, которые взаимодействуют с БД, и я реализую эти обозначения внутри DataHandler, который находится в инфраструктурном проекте..теперь вот мой вопрос, в моем основном IDataHandler выглядит:

 public interface IDataHandler {  public Tasklt;StudentsModelgt; GetStudent(string id); }  

в моей инфраструктуре у меня есть StudensEntity,который является точной копией модели Student, но когда я хочу внедрить IDataHandler, я не могу использовать его так:

 public interface DataHandler:IDataHanlder {  public Tasklt;StudentsEntitygt; GetStudent(string id); }  

если тип возвращаемого значения не совпадает с его интерфейсом,даже если они имеют одинаковые свойства,я думаю,вы понимаете,что я пытаюсь спросить, если да, то что мне делать?

Комментарии:

1. К сожалению, это не очень подходит для stackoverflow, речь идет об архитектурном шаблоне, который может иметь множество решений, открытых для интерпретации, и не может иметь правильных или неправильных ответов. Может быть, попробовать, программная инженерия.

2. @TheGeneral я прочитал шаблон лука и придумал это.

3. Почему ваш обработчик данных напрямую не создает и не возвращает класс модели? Почему у вас есть дополнительный класс сущностей?

Ответ №1:

Решение, которое вы предложили, отражает принципы чистой архитектуры, особенно в отношении разделения интерфейсов репозитория ( IDataHandler ) и реализаций репозитория ( DataHandler ), а также между тем, что вы называете «моделями» ( StudentModel ) и «сущностями модели» ( StudentEntity ).

в моей инфраструктуре у меня есть StudensEntity, который является точной копией модели StudentModel

Для того, чтобы это сработало, базовая модель должна фактически быть либо абстрактным классом , либо интерфейсом, например, интерфейсом IStudent вместо класса StudentModel , и модель инфраструктуры StudentEntity должна реализовывать этот интерфейс. Это может привести к такому (упрощенному) коду:

 // Core (domain language) public interface IStudent {  long Id { get; }  string Name { get; } }  // Infrastructure public StudentEntity : IStudent {  public StudentEntity(long id, string name)  {  this.Id = id;  this.Name = name;  }   public long Id { get; }  public string Name { get; } }  // Core (domain language) public interface IDataHandler {  Tasklt;IStudentgt; GetStudent(string id); }  // Infrastructure public class DataHandler : IDataHanlder {  public async Tasklt;IStudentgt; GetStudent(string id)  {  // Construct StudentEntity from database and return it.  } }