나는 이것에 대해 조금 살펴 보았고 "완벽한"해결책을 찾지 못했다. 리포지토리 패턴은 컨텍스트가 짧은 라이브 컨트롤러에 있기 때문에 컨텍스트가 짧은 라이브 인 MVC 응용 프로그램에서 훌륭하게 작동하지만 VM이 오랫동안 지속될 수있는 wpf 앱에 동일한 구조를 적용하려고하면 문제가 발생합니다.
나는 과거 에이 솔루션을 사용하여 많은 레포 패턴보다 훨씬 간단합니다. 여러분을 극단으로 추상화하려고 시도하여 읽을 수없는 양의 코드를 디버깅하기가 어렵습니다. 단계는 다음과 같습니다.
- EDMX가 데이터 액세스 계층으로 작동 할 별도의 프로젝트를 만듭니다.
- 동일한 프로젝트에서 "리포지토리"폴더 생성
"작업 단위"로 작동 할 기본 클래스 "BaseRepository"를 작성하십시오. IDisposable
에서 이것을 사용할 수 using(){}
있고 partial
다른 저장소를 구현할 수 있습니다.
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
"MyOtherRepository"라는 다른 파일을 작성하십시오. 동일한 부분 클래스를 작성하지만 파일에 포함하려는 내용을 기반으로 메소드를 구현하십시오.
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
이제 VM 에서이 작업을 수행 할 수 있습니다 ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
모든 리포지토리를 하나의 클래스로 그룹화하므로 별도의 컨텍스트를 처리 할 필요가 없습니다. 메소드를 다른 파일로 그룹화하여 다른 리포지토리를보다 잘 관리하고 코드 중복을 방지 할 수 있습니다. 또한,이 패턴을 사용하지 않는 것처럼 컨텍스트의 수명이 짧습니다.
단점은 더 큰 시스템에서는 리포지토리에 번들로 제공되는 많은 방법이있을 수 있다는 것입니다. 이 경우 하나의 솔루션은 "찾기"또는 "추가"와 같은 몇 가지 기본 공통 명령을 구현하고 해당 저장소에서 특수 명령을 구현하는 것입니다.