이것은 일반적인 저장소에서 작업하는 방식이 아닙니다. 우선, 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 버전은 조금 더 간단 할 수 있습니다.