2009-06-30 4 views
1

ASP.NETの多くの例では、データソースとしてLinq2Sqlを使用しています。Linq2Sqlモデル以外のインスタンスASP.NET MVCでのバインディングの例

Linq2Sql以外のデータソース、つまりデータセット、または(私の場合のように)カスタムビジネスオブジェクトに基づくアイテムの汎用リスト/コレクションでモデルバインディングを使用する方法を示す例はありますか?つまり

public class WebsiteList : List<Website> 
{ 
    public WebsiteList() 
    { 
    } 
} 

ASP.NET MVCは、特に「あなたの使いたいものを使用する」アプローチにとって偉大です。非常に多くの例がLinq2Sqlを使用していることは残念です。

答えて

2

多くの例では、Linq2Sqlの部分を独自のカスタムリポジトリに置き換えて使用できます。それはIQueryableなので、 "WebsiteList.AsQueryable()"で置き換えることができ、ほとんどの例をそのまま使用できます。

public class FakeRepository<T> : IResourceRepository<T> where T : class 
{ 
    private readonly List<T> items = new List<T>(); 
    private readonly IObjectFactory resolver; 

    public FakeRepository(IObjectFactory resolver) 
    { 
     this.resolver = resolver; 
    } 

    public IQueryable<T> GetAll() 
    { 
     return this.items.AsQueryable(); 
    } 

    public void Save(T item) 
    { 
     if (!this.items.Contains(item)) 
     { 
      this.items.Add(item); 
     } 
    } 

    public void Delete(T item) 
    { 
     this.items.Remove(item); 
    } 

    public T Create() 
    { 
     return this.resolver.GetInstance<T>(); 
    } 
} 

が、私は(亜音速Linq2Sql、ADO.NETエンティティ、...かもしれない)本当のリポジトリとこれを簡単に入れ替えることができます。たとえば、ここで私が使用してダミーのリポジトリです。

0

Linq to SQLは、データベーステーブルを取得し、ビジネスクラスにマップします。 LinqをSQLにしないで同じことをするには、データクラスを手動でモデル化し、データベースから読み込んでデータベースに保存するコードを組み込みます。

namespace MyProject.Model 
{ 
    public class Website 
    { 
     public int WebsiteID { get; set } 
     public string Name { get; set } 
     public string Url { get; set } 
     public string Author { get; set } 
    } 

    public class WebsiteRepository 
    { 
     public Website Read(int id) { // read from database } 
     public void Write(Website website) { // write to database } 
     public website[] GetWebsites { } 
    } 
} 

namespace MyProject.Controllers 
{ 
    public class WebsiteController 
    { 
     WebsiteRepository repository = new WebsiteRepository(); 

     ActionResult Index() 
     { 
      Website[] websites = repository.GetWebsites(); 
      return View(websites); 
     } 
    } 
} 
+0

これは〜LINQ-to-SQLでも同様です。残りのコードベースをLINQで生成されたクラスに強くバインドするのが好きではありません。そのため、私が作成したPOCO間で変換されます。 – mmcdole

+0

ありがとうございます。これは私の質問にも答えますが、答えとして両方を選択する方法がわかりません。 – Dkong