パターンEntity Frameworkの4「作業ユニットは、」一般的なリポジトリのために行くための方法ですか?
-
26-09-2019 - |
質問
私は私が働いている新しいASP.NET MVCプロジェクトのためのEntity Frameworkの4ジェネリックリポジトリを作成するに探しています。私は、さまざまなチュートリアルを見てきた、彼らはすべての作業パターンの単位を使用するように見える...
は、私が読んでいたものから、EFはObjectContextは内、すでにこれを使用している、あなたは、単に仕事の独自の単位を作るために、これを拡張しています。
ソース:<のhref = "http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET+Zone )」のrel = "nofollowをnoreferrer"> http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET +ゾーン) の
なぜ1は、これを行うの努力に行くのでしょうか? これは、一般的なリポジトリでの作業の好ましい方法ですか?
多くのおかげで、 湖畔ます。
解決
これは、私は、一般的なリポジトリとうまくいく方法ではありません。まず第一に、私は現在のリクエストにClassARepository、CalssBRepositoryと他のリポジトリ間のObjectContextを共有することになります。 、IOCのコンテナを使用して注入し、要求行動ごとに使用することが推奨されます:
これは私の一般的なリポジトリがどのように見えるかです
public interface IRepository<T>
{
//Retrieves list of items in table
IQueryable<T> List();
IQueryable<T> List(params string[] includes);
//Creates from detached item
void Create(T item);
void Delete(int id);
T Get(int id);
T Get(int id, params string[] includes);
void SaveChanges();
}
public class Repository<T> : IRepository<T> where T : EntityObject
{
private ObjectContext _ctx;
public Repository(ObjectContext ctx)
{
_ctx = ctx;
}
private static string EntitySetName
{
get
{
return String.Format(@"{0}Set", typeof(T).Name);
}
}
private ObjectQuery<T> ObjectQueryList()
{
var list = _ctx.CreateQuery<T>(EntitySetName);
return list;
}
#region IRepository<T> Members
public IQueryable<T> List()
{
return ObjectQueryList().OrderBy(@"it.ID").AsQueryable();
}
public IQueryable<T> List(params string[] includes)
{
var list = ObjectQueryList();
foreach(string include in includes)
{
list = list.Include(include);
}
return list;
}
public void Create(T item)
{
_ctx.AddObject(EntitySetName, item);
}
public void Delete(int id)
{
var item = Get(id);
_ctx.DeleteObject(item);
}
public T Get(int id)
{
var list = ObjectQueryList();
return list.Where("ID = @0", id).First();
}
public T Get(int id, params string[] includes)
{
var list = List(includes);
return list.Where("ID = @0", id).First();
}
public void SaveChanges()
{
_ctx.SaveChanges();
}
#endregion
}
のObjectContextは、コンストラクタを介して注入されます。リスト()メソッドは、ビジネス層(サービス)オブジェクトにさらなる処理のためのIQueryableを返します。サービス層は、リストまたはIEnumerableをを返すので、ビューには繰延実行はありません。
このコードは、EF1を使用して作成されました。 EF4のバージョンが少し違うとシンプルにすることができます。