0

我有一个控制器,它返回一个 ViewModel 到一个视图,它工作得很好。我想迁移到存储库模式,但无法在存储库中获取正确的语法。我已经创建了存储库和它的接口。

 public interface IShippingRepository
{
    IQueryable<ShippingCommHdr> All { get; }
    IQueryable<ShippingCommHdr> AllIncluding(params Expression<Func<ShippingCommHdr, object>>[] includeProperties);
    void InsertOrUpdate(ShippingCommHdr shippingcommhdr);
    void Delete(int id);
    void Save();
}

这是我要移动到存储库的控制器的代码:

public ViewResult ShippingSummary()
    {
        CPLinkEntities context = new CPLinkEntities();
        var shipments =
                  from h in context.ShippingCommHdrs
                  where (h.CompletedDate == null)
                  join
                  e in context.vHr_Employees on h.CreatedBy equals e.ID
                  join
                  s in context.Shippers on h.ShipperID equals s.ShipperID
                  join
                  r in context.vAaiomsSites on h.ShipToSiteID equals r.SiteID
                  join
                  c in context.vHr_Employees on h.CreatedBy equals c.ID
                  join
                  p in context.vHr_Employees on h.FromSitePOC equals p.ID
                  select new
                  {
                      h.ID,
                      ShippedToSite = r.SiteName,
                      h.DateShipped,
                      h.EstDeliveryDate,
                      h.TrackingNo,
                      h.HeaderComments,
                      h.ShippingCommLI.Count,
                      s.Shipper,
                      CreatedBy = c.LastName,
                      FromSitePoc = p.LastName

                  };

        var model = new List<ShippingSummaryVM>();

        foreach (var h in shipments)
        {

            var viewModel = new ShippingSummaryVM
            {
                ID = h.ID,
                ShippedToSite = h.ShippedToSite,
                DateShipped = h.DateShipped,
                EstDeliveryDate = h.EstDeliveryDate,
                TrackingNo = h.TrackingNo,
                FromSitePOC = h.FromSitePoc,
                Shipper = h.Shipper,
                HeaderComments = h.HeaderComments,
                NumOrders = h.Count,
                CreatedBy = h.CreatedBy,

            };

            model.Add(viewModel);
        }

        return View(model);

    }

如果我能让这个 Controller/Repository 工作,我就可以相当快地迁移所有其他控制器/存储库。感谢您的帮助

4

3 回答 3

3

我首先将方法定义添加到您需要执行的查询的存储库接口。存储库可以给这个查询一个有意义的名字:

public interface IShippingRepository
{
    IQueryable<Shipment> GetShipments()
    // ...
}

在控制器中,您需要一个存储库实例。您可以将它注入到构造函数中,或者在构造函数中创建一个,但是无论哪种方式,存储库都需要在幕后与 CPLinkEntities 上下文进行对话。您需要将上下文传递到存储库以供存储库使用。

public class SomeController : Controller
{

    IShippingRepository _shippingRepository;

    public SomeController()
    {
        _shippingRepository = new ShippingRepository(new CPLinkEntities());
    }


    public ViewResult ShippingSummary()
    {
        var shipments = _shippingRepository.GetShipments();

        // ....
    }   
}

具体的存储库定义可能如下所示。

public class ShippingRepository : IShippingRepository
{
    CPLinkEntities _entities;

    ShippingRepository (CPLinkEntities entities)
    {
        _entites = entities;
    }

    public IQueryable<Shipment> GetShipments()
    {
        return from ship in _entities.Ships join ... join ... select
    }
}
于 2012-06-21T12:39:53.067 回答
0

您的控制器方法基本上有两个职责

  1. 运行查询
  2. 将查询结果映射到视图模型中

您可以将该查询放入存储库,然后您可以使用AutoMapperValueInjecter等自动映射器工具来帮助您将查询结果映射到视图模型。

您生成的控制器方法将简单地调用存储库以获取 CPLinkEntities 列表。然后,您的控制器方法可以获取这些实体,然后调用自动映射器为您提供 ShippingSummaryVM 的列表。我留下了一些实现细节,但这应该让您对如何实现您的要求有一个高度的了解。

于 2012-06-20T20:52:27.400 回答
0

选项 A:拥有更强大的领域模型。您的存储库将负责加载根级域对象,并让底层 OR/M 处理对象遍历。您的控制器将调用装运方法来查找尚未完成的装运。您将取回一个货件对象,并可以遍历相关实体以获取您的 VM 所需的站点名称和其他详细信息

选项 B:拥有为每个实体返回全部的存储库,然后在业务或服务层中进行连接。即使您说 ShippingRepository.All,实体框架也不会全部加载。它仅在最后一个负责任的时刻加载(当您需要具体化结果时)。因此,您可以有一个业务方法,将每个实体上的“全部”加入并根据完成日期进行过滤,然后返回结果。

选项 A 更好,但可能需要更多的工作。

于 2012-06-20T21:46:30.330 回答