1

저는 작업중인 새로운 ASP.NET MVC 프로젝트를위한 Entity Framework 4 일반 저장소를 만들려고합니다. 다양한 튜토리얼을 살펴 봤는데 모두 Unit of Work 패턴을 사용하고있는 것 같습니다 ...Entity Framework 4 "작업 단위"패턴이 일반 리포지토리를 만드는 방법입니까?

내가 읽은 것으로부터 EF는 이미 ObjectContext 내에서이 것을 사용하고 있으며 이것을 확장하여 자신 만의 튜토리얼을 만들었습니다 작업 단위.

출처 : http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET+Zone)

왜 하나는이 일의 노력에 갈 것인가? 일반 저장소에서 작업하는 것이 가장 좋은 방법입니까?

감사합니다. Kohan.

답변

3

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

관련 문제