将DTO映射到存储库中用于创建/添加方法的实体

问题描述 投票:0回答:1

我有一个Web Api应用程序,其中有EF DB第一实体和DTO类。这是我的通用存储库界面-

public interface IRepository<TEntity> where TEntity:class
    {
        IQueryable<TEntity> GetAll();
        void Create(TEntity Entity);

        TEntity GetById(int id);
        void Update(TEntity Entity);
        void Remove(int id);
    }

这里是其中一项服务的GetAll方法实现的示例-

public class OrdersRepository : IRepository<SalesOrderHeader>
    {
        private AdventureWorksEntities db = new AdventureWorksEntities();
 public IQueryable<SalesOrderHeader> GetAll()
        {
            return db.SalesOrderHeaders;

        }

这是我的服务或apicontroller调用该方法以及其他映射-

public IQueryable<Orders> GetSalesOrderHeaders()
        {
            **var Orders = orderRepo.GetAll();**
            var OrderDetails = orderDetailRepo.GetAll();
            return (from so in Orders
                    select new Orders()
                    {
                        SalesOrderID = so.SalesOrderID,
                        SalesOrderNumber = so.SalesOrderNumber,
                        ShipDate = so.ShipDate.ToString(),
                        Customer = customerRepo.GetById(so.CustomerID),
                        OrderItems = (from sod in OrderDetails
                                      select new OrderItems()
                                      {
                                          SalesOrderId = sod.SalesOrderID,
                                          ProductID = sod.ProductID,
                                          Quantity = sod.OrderQty,
                                          UnitPrice = sod.UnitPrice
                                      }).Where(a => a.SalesOrderId == so.SalesOrderID).ToList()
                    });
        }

如此处所示,映射是在apicontroller类中完成的。同样对于存储库的Create / Add方法,这将在哪里发生?如果在apicontroller中,这是否意味着我需要访问apicontroller中的Entity?如果在存储库中,那么我将不得不将DTO映射到我的存储库中的Entity。两者似乎都令人怀疑。这是我的DTO课程-

 public class Orders
    {
        public int SalesOrderID { get; set; }
        public string SalesOrderNumber { get; set; }

        public string ShipDate { get; set; }
        public CustomerDTO Customer { get; set; }

        public List<OrderItems> OrderItems { get; set; }

    }

实体类称为SalesOrderHeaders,并且具有更多字段。

asp.net-web-api2 repository-pattern dto n-tier-architecture
1个回答
0
投票

都不是。像您一样,我在代码中遇到了这个难题,因此决定在控制器或存储库中实施对象映射只会增加不必要的复杂性,并且最终会违反DRY(D

© www.soinside.com 2019 - 2024. All rights reserved.