2012-06-09 5 views
0

저는 NerdDinner (MVC 2)를 프로젝트의 기초로 사용하고 있습니다. 리포지토리 인터페이스 디자인이 잘 작동하는 동안, 실제 응용 프로그램에는 12 개의 모델 클래스가 있습니다 (NerdDinner에는 Dinner가 하나만 포함됨). 이는 각 클래스에 대해 하나의 인터페이스 (및 구현)가 필요하다는 것을 의미합니다. 또한 기본 인터페이스 메서드 (가져 오기, 저장, 추가, 삭제 등)는 동일하므로 모든 구현 클래스에서 동일한 코드를 &에 붙여 넣어야합니다.NerdDinner 일반 저장소 인터페이스?

void Add(Customer customer) 

및 주문의 인터페이스가 노출 :

void Add(Order order) 

구현은 기본적으로 방법 만 사용 모두 동일 변경 유일한 것은 고객의 인터페이스를 노출 예를 들어, 클래스의 종류이다 물론 적절한 모델 유형 :

db.Customers.InsertOnSubmit(customer) 

db.Orders.InsertOnSubmit(order) 

입니다. 또 다시 동일한 코드를 반복 중지 (내 프로젝트에서 .cs 파일의 수를 최소화) 내가 예를 들어, 나는 일반적인 기본 저장소 인터페이스를 정의 할 수 있다고 생각합니다 :

public interface IRepository<T> 
{ 
void Add(T t) 
void Delete(T t) 
void Save(); // This one is truly the same in any case! 
} 

하지만 난 어떻게 적용 할 수 있습니다 제네릭 유형을 구현 코드로? 다음과 같은 것이 필요합니다.

db.T.InsertOnSubmit(t) 

이 작업을 수행 할 수 있습니까?

추 신 : db는 datacontext 개체입니다 (저는 linq를 SQL 디자이너에 사용하고 있습니다).

감사

답변

1
질문

에서

하지만 구현 코드에 제네릭 형식을 적용 할 수있는 방법? 다음과 같은 것이 필요합니다.
db.T.InsertOnSubmit (t)
이 작업을 수행 할 수 있습니까?

public class Repository<T> : IRepository<T> where T : class 
{ 
    private NorthwindDataContext db = new NorthwindDataContext(); 

    public Table<T> Data 
    { 
     get 
     { 
      return db.GetTable<T>(); 
     } 
    } 

    public void Add(T entity) 
    { 
     db.GetTable<T>().InsertOnSubmit(entity); 
    } 

    public void Delete(T entity) 
    { 
     db.GetTable<T>().DeleteOnSubmit(entity); 
    } 

    public void Save() 
    { 
     db.SubmitChanges(); 
    } 
} 
: 당신을 가정하고

당신에게 아이디어를 제공하기 위해이

db.GetTable<T>().InsertOnSubmit(entity); 

간단한 저장소 구현 같은 뭔가가 필요