1
我正在研究爲我正在創建的新ASP.NET MVC項目創建實體框架4通用存儲庫。我一直在看各種教程,他們似乎都使用工作單元模式... ...實體框架4「工作單元」模式是否適用於通用存儲庫?
從我一直在閱讀,EF使用它已經在ObjectContext中,你只是擴大這個使你自己工作單位。
一個爲什麼會去這樣做的努力? 這是使用通用存儲庫的首選方式嗎?
非常感謝, Kohan。
我正在研究爲我正在創建的新ASP.NET MVC項目創建實體框架4通用存儲庫。我一直在看各種教程,他們似乎都使用工作單元模式... ...實體框架4「工作單元」模式是否適用於通用存儲庫?
從我一直在閱讀,EF使用它已經在ObjectContext中,你只是擴大這個使你自己工作單位。
一個爲什麼會去這樣做的努力? 這是使用通用存儲庫的首選方式嗎?
非常感謝, Kohan。
這不是我使用通用存儲庫的方式。首先,我會在當前請求中的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的是通過構造函數注入。 List()方法返回IQueryable,以便在業務層(服務)對象中進一步處理。服務層返回List或IEnumerable,所以視圖中不會延遲執行。
此代碼是使用EF1創建的。 EF4版本可以有點不同,更簡單。