#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. } }