0

ViewModelをViewに返すコントローラーがあり、問題なく動作します。リポジトリパターンに移行したいのですが、リポジトリで正しい構文を取得するのに問題があります。リポジトリとそのインターフェイスを作成しました。

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

    }

この1つのコントローラー/リポジトリーを機能させることができれば、他のすべてのコントローラー/リポジトリーをかなり迅速に移行できます。助けてくれてありがとう

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

コントローラーメソッドには基本的に2つの責任があります

  1. クエリを実行する
  2. クエリの結果をビュー モデルにマップする

そのクエリをリポジトリに配置すると、AutoMapperValueInjecterなどの自動マッパー ツールを使用して、クエリの結果をビュー モデルにマップできます。

結果のコントローラー メソッドは、単にリポジトリを呼び出して CPLinkEntities のリストを取得します。次に、コントローラ メソッドでこれらのエンティティを取得し、オートマッパーを呼び出して ShippingSummaryVM のリストを取得できます。実装の詳細をいくつか残しましたが、これにより、求めていることを達成する方法についての高レベルの理解が得られるはずです。

于 2012-06-20T20:52:27.400 に答える
0

オプション A: より強力なドメイン モデルを用意する。リポジトリはルート レベル ドメイン オブジェクトのロードを担当し、基礎となる OR/M にオブジェクト トラバーサルを処理させます。コントローラーは、出荷時にメソッドを呼び出して、まだ完了していない出荷を見つけます。出荷オブジェクトを取得し、関連するエンティティにトラバースして、VM に必要なサイト名やその他の詳細を取得できます。

オプション B: エンティティごとにすべてを返すリポジトリを用意し、ビジネスまたはサービス レイヤーで結合を行います。ShippingRepository.Allと言っても、Entity Frameworkはすべてをロードしません。最後の責任ある瞬間(具体化された結果が必要な場合)にのみロードされます。したがって、各エンティティの「すべて」を結合し、完了日に基づいてフィルタリングして結果を返すビジネス メソッドを作成できます。

オプション A の方が優れていますが、より多くの作業が必要になる可能性があります。

于 2012-06-20T21:46:30.330 に答える