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); 

    } 

Если бы я мог получить этот один контроллер/Repository для работы, я могу затем перенести все остальное более довольно быстро. спасибо за любую помощь

ответ

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 
    } 
} 
+0

Желаю, чтобы я мог проголосовать Более одного раза, я мог быть предвзятым, потому что мне нравится Скотт, это самый простой способ объяснить хранилище. – Rab

0

Ваш метод управления в основном имеет 2 обязанности

  1. выполнить запрос
  2. Карта результатов запроса в модели представления

Вы можете поместить этот запрос в репозиторий, а затем вы можете использовать инструмент auto-mapper, например AutoMapper или ValueInjecter, чтобы помочь вам сопоставить результаты вашего запроса с моделью просмотра.

Результирующий метод контроллера просто вызовет репозиторий для получения списка CPLinkEntities. Затем ваш метод контроллера мог взять эти объекты, а затем вызвать automapper, чтобы предоставить вам список ShippingSummaryVM. Я оставил некоторые детали реализации, но это должно дать вам понимание на высоком уровне того, как добиться того, что вы просите.

0

Вариант A: иметь более прочную модель домена. Ваш репозиторий будет отвечать за загрузку объектов домена корневого уровня, и вы разрешите обход объекта объекта OR/M. Ваш контроллер будет вызывать метод при отправке, чтобы найти отгрузки, которые еще не завершены. Вы вернете объект отправки и можете перейти к связанным объектам, чтобы получить имя сайта и другие данные, необходимые для вашей виртуальной машины.

Вариант B: Имеются репозитории, которые возвращают все для каждой сущности, а затем выполните объединение в бизнес или уровень обслуживания. Entity Framework не будет загружать все, даже если вы скажете ShippingRepository.All. Он загружается только в последний ответственный момент (когда вам нужен материализованный результат). Таким образом, у вас может быть бизнес-метод, который объединяет «Все» на каждом объекте и фильтрует на основе завершенной даты, а затем возвращает результат.

Вариант A лучше, но может быть намного больше работы.

Смежные вопросы