هل نمط "وحدة العمل" 4 "وحدة العمل" هو الطريق للذهاب للمستودعات العامة؟
-
26-09-2019 - |
سؤال
أنا أبحث في إنشاء مستودع عام 4 إطار عمل لمشروع ASP.NET MVC جديد أعمل عليه. لقد كنت أبحث في العديد من البرامج التعليمية ويبدو أنها تستخدم وحدة نمط العمل ...
من ما كنت أقرأه ، تستخدم EF هذا بالفعل داخل ObjectContext وأنت ببساطة تمديد هذا لجعل وحدات العمل الخاصة بك.
لماذا يذهب المرء إلى جهد القيام بذلك؟ هل هذه هي الطريقة المفضلة للعمل مع المستودعات العامة؟
شكرا جزيلا ، كوهان.
المحلول
ليست هذه هي الطريقة التي سأعمل بها مع مستودعات عامة. بادئ ذي بدء ، أود أن أشارك ObjectContext بين classArePository و CalsSbrepository وغيرها من المستودعات في الطلب الحالي. باستخدام حاوية 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 لمزيد من المعالجة في كائنات طبقة الأعمال (الخدمة). قائمة إرجاع طبقة الخدمة أو غير قابلة للتطبيق ، لذلك لا يوجد تنفيذ مؤجل في وجهات النظر.
تم إنشاء هذا الرمز باستخدام EF1. يمكن أن يكون إصدار EF4 مختلفًا قليلاً وأبسط.