Использование DTO для передачи данных между уровнем сервиса и уровнем UI
Я пытался выяснить это в течение нескольких дней, но, похоже, очень мало информации по этому конкретному вопросу с ASP.NET MVC. Я гуглил в течение нескольких дней и не смог ничего выяснить по этому конкретному вопросу.
У меня есть трехслойный проект. Бизнес, DAL и пользовательский интерфейс / веб-слой. В DAL есть dbcontext, репозиторий и единица работы. На бизнес-уровне находится доменный уровень со всеми интерфейсами и моделями EF. На бизнес-уровне также существует сервисный уровень с DTO для моделей EF и универсальная служба репозитория, которая обращается к репозиторию.Этот картина должна помочь объяснить это.
Моя проблема в том, что я просто не могу понять, как использовать DTO для передачи данных с бизнес-уровня.
Я создал классы обслуживания для DTO. У меня есть ImageDTO и модель, и то же самое для якорей изображения. Я создал класс обслуживания для каждого DTO. Так что у меня есть сервис изображений и якорный сервис. Эти сервисы наследуют сервис репозитория и в настоящий момент реализуют свои сервисы. Но это примерно, насколько я получил. Поскольку у этих сервисов есть конструкторы, которые получают интерфейс IUnitOfWork через IoC, я в значительной степени застрял.
Если я обращаюсь к сервису напрямую из пользовательского интерфейса, все работает как надо, но я просто не могу понять, как использовать DTO для передачи данных как с сервисного уровня на уровень пользовательского интерфейса, так и наоборот.
Мой уровень обслуживания:
Бизнес / Услуги / DTOS
public class AnchorDto
{
public int Id { get; set; }
public int x1 { get; set; }
public int y1 { get; set; }
public int x2 { get; set; }
public int y2 { get; set; }
public string description { get; set; }
public int imageId { get; set; }
public int targetImageId { get; set; }
public AnchorDto(int Id, int x1, int y1, int x2, int y2, string description, int imageId, int targetImageId)
{
// Just mapping input to the DTO
}
}
public class ImageDto
{
public int Id { get; set; }
public string name { get; set; }
public string title { get; set; }
public string description { get; set; }
public virtual IList<AnchorDto> anchors { get; set; }
public ImageDto(int Id, string name, string title, string description, IList<AnchorDto> anchors )
{
// Just mapping input to DTO
}
}
Бизнес / Услуги / Услуги
public class RepoService<TEntity> : IRepoService<TEntity> where TEntity : class
{
private IRepository<TEntity> repo;
public RepoService(IUnitOfWork repo)
{
this.repo = repo.GetRepository<TEntity>();
}
public IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
return repo.Get(filter, orderBy, includeProperties);
}
public TEntity GetByID(object id)
{
return repo.GetByID(id);
}
public void Insert(TEntity entity)
{
repo.Insert(entity);
}
public void Delete(object id)
{
repo.Delete(id);
}
public void Delete(TEntity entityToDelete)
{
repo.Delete(entityToDelete);
}
public void Update(TEntity entityToUpdate)
{
repo.Update(entityToUpdate);
}
}
Сервис Image, интерфейс IImageService в настоящее время пуст, пока я не выясню, что мне нужно реализовать.
public class ImageService : RepoService<ImageModel>, IImageService
{
public ImageService(IUnitOfWork repo)
: base(repo)
{
}
}
На данный момент мои контроллеры не работают и не используют уровень обслуживания, поэтому я решил не включать ни один из них. Я планирую сопоставить DTO с ViewModels с помощью автоматического сопоставления, как только я разберусь с этой проблемой.
Так что теперь, пожалуйста, кто-нибудь достаточно знающий, чтобы дать мне ту идею, которую я скучаю, чтобы я мог понять это?