几天来我一直试图弄清楚这一点,但似乎很少有关于 ASP.NET MVC 的特定主题的信息。我已经在谷歌上搜索了几天,并没有真正弄清楚这个特定问题。
我有一个 3 层项目。业务、DAL 和 UI/Web 层。在 DAL 中是 dbcontext、存储库和工作单元。业务层是一个领域层,包含所有接口和 EF 模型。在业务层中,还有一个带有用于 EF 模型的 DTO 的服务层和一个访问存储库的通用存储库服务。这张图片应该有助于解释它。
我的问题是我似乎无法弄清楚如何使用 DTO 从业务层传输数据。
我为 DTO 创建了服务类。我有一个 ImageDTO 和模型,对于图像锚点也是如此。我为每个 DTO 创建了一个服务类。所以我有一个图像服务和锚点服务。这些服务继承了存储库服务,目前实现了它们自己的服务。但这就是我所得到的。由于这些服务具有通过 IoC 接收 IUnitOfWork 接口的构造函数,因此我几乎陷入了困境。
如果我直接从 UI 引用服务,一切都会正常工作,但我只是想不通如何使用 DTO 将数据从服务层传输到 UI 层,反之亦然。
我的服务层:
业务/服务/DTO
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 Service,IImageService 接口目前是空的,直到我弄清楚我需要实现什么。
public class ImageService : RepoService<ImageModel>, IImageService
{
public ImageService(IUnitOfWork repo)
: base(repo)
{
}
}
目前我的控制器并没有真正工作并且没有使用服务层,所以我决定不包括任何这些。一旦我解决了这个问题,我计划使用自动映射器将 DTO 映射到 ViewModel。
所以现在,请任何知识渊博的人给我我所缺少的想法,以便我能解决这个问题?