2011-01-05 4 views
0

저는 C#과 .net을 사용하여 저장소 패턴을 가지고 놀았습니다.저장소 패턴을 사용하여 개체의 새 인스턴스를 만드는 올바른 방법은 무엇입니까?

내 질문에 관해서는 someRepositoryObject의 새 인스턴스를 만듭니다.

using(ISomeRepository someRepository = new SomeRepository().getRepository()) 
{ 
    IsomeRepositoryObject repObj = new someRepositoryObject(); 
} 

new someRepositoryObject가 처음에 인터페이스를 사용하는 포인트를 제거 호출하지 않습니다 : 내가 본 모든 예제는 지금까지 같은 것을 사용?

using(ISomeRepository someRepository = new SomeRepository().getRepository()) 
{ 
    IsomeRepositoryObject repObj = someRepository.NewsomeRepositoryObject(); 
} 

그래서 저장소 자체가 필요한 개체의 새 인스턴스를 반환하고 호출하는 코드는 클래스의 지식이 유형 ISomeRepositoryObject의 단지 것을, 그것을 전달되지되고 있습니다 더 나은 뭔가를 수행하는 것입니다.

이것은 나에게 모두 새로운 것이므로 분명히 뭔가 빠져있을 수 있습니다!

도움을 주시면 감사하겠습니다.

+0

. getRepository()'대신'새로운 SomeRepository의()'또는'RepositoryFactory.getSomeRepository 같은 것을()'또는'SomeRepository.getRepository()'? – hangy

+0

그것에 대해 생각하면 이유가 없습니다! getRepository를 사용하여 올바른 저장소 유형을 반환하는 데 사용 된 web.config appsetting을 가져 왔습니다. 이 코드는 SomeRepository의 생성자에 추가 될 수 있습니다. –

+0

사실, 코드를 보면 .getSomeRepository()를 사용하여 IsomeRepository 객체를 반환했습니다. 이것은 내가 크리스마스 방학을 가기 전에 함께 연주 한 것입니다. –

답변

0

일반적으로 나는 두 번째 방법을 사용하여 저장소를 새 인스턴스로 만듭니다. 그 이유는 - 내가 언급 한 것처럼, 인터페이스의 구현을 저장소를 사용하는 코드와 분리하려고하고 있기 때문입니다.

0

IOC 컨테이너를 사용하여 도움을 드리겠습니다.

Ninject은 이것에 대한 좋은 해결책입니다. 예를 들어, 내 MVC 프로그램에서 내 모든 컨트롤러는 어떤 서비스가 필요 다음 IService가 Ninject에 의해 주입

public class SampleController: Controller { 
    public SampleController(IService service) {} 

} 

을 만 global.asax.cs는 구체적인 클래스를 인정해야합니다.

0

방금 ​​설명한 것은 추상 공장 패턴입니다. 저장소의 경우 IoC 컨테이너를 사용하여 새 개체를 만드는 것이 좋습니다. 이 경우에는 새 키워드를 전혀 사용하지 않으므로 추상화 작업 만 수행합니다. 그냥 호기심, 왜`새로운 SomeRepository() 중 Repository by Martin Fowler

관련 문제