2013-12-15 6 views
0

내 MVC 계층에는 리포지토리가 전혀 없을 것입니다.간단한 인젝터를 비즈니스 계층의 저장소에 사용하는 방법

내 DAL 프로젝트 레이어에서 일반 EFRepository, IRepositoryPASContext (DbContext에서 상속)을 받았습니다.

내 MVC 프로젝트에서 빠른 시작으로 Simple Injector를 설치했고 thats를 사용하여 저장소에서 원하는 각 컨트롤러의 생성자를 얻을 수 있습니다.

하지만 내 솔루션에는 BLL 프로젝트가 있고이 아키텍처는 BLL 레이어와 만 이야기하기를 원합니다. 프로젝트 아키텍처이며 향후 BLL 레이어 내의 클래스에 논리를 추가하고 싶습니다. 내가 BLLProduct 클래스를 시작할 수있는 방법

public class BLLProducts 
{ 
    IRepository<Product> ProductRepository; 

    public BLLProducts(EFRepository<Product> Repository) 
    { 
     ProductRepository = Repository; 
    } 

    public ICollection<Product> getAll() 
    { 
     return ProductRepository.All().ToList(); 
    } 
} 

:

은 또한 내가 내 BLL 층에서 컨텍스트를 생성하지 않지만, 저장소가 0 인수를 생성자가없는이 내 ProductBLL 클래스 저장소 또는 컨텍스트를 만들지 않고 컨트롤러 또는 unitTest에서? 그래서 여기에 내 추상화를 유지할 수 있습니다.

내가 여기 어떻게 든 간단한 주사기를 사용해야한다는 것을 알고있다. 나는 그저 어떻게하는지 모른다. 컨트롤러의 관점에서

답변

1

, 그것은 다음과 같이 그것으로 BLLProducts를 주입 단지 문제 : 단위 테스트 관점에서

// constructor 
public HomeController(BLLProducts products) { 
    this.products = products; 
} 

최적 인 컨트롤러가 구체적인 클래스에 의존시키는 (가 위반 Dependency Inversion Principle). 이제는 BLLProducts 인스턴스를 만들어 DbContext으로 인스턴스화해야하므로이 최적 조건입니다.이 DbContext는 데이터베이스에 종속 된 Entity Framework에만 해당됩니다. 이로 인해 테스트가 더욱 어려워지고 느려집니다. 단위 테스트가 데이터베이스없이 실행되기를 원합니다.

그래서이 해결책은이 BLLProducts 클래스를 추상화 뒤에 숨기는 것입니다. 이를 수행하는 간단한 방법은이 클래스에서 인터페이스를 추출하는 것입니다.

public interface IBLLProducts { 
    ICollection<Product> getAll(); 
} 

이렇게하면 단위 테스트가 훨씬 쉬워집니다. 당신이해야 할 유일한 것은 그것이이 새로운 인터페이스에 의존하게된다

public HomeController(IBLLProducts products) { 
    this.products = products; 
} 

당신은 간단한 인젝터에서이 IBLLProducts 인터페이스를 등록해야합니다 :

container.Register<IBBLProducts, BLLProducts>(); 

이 모든 모델은 여전히 ​​몇 가지 단점이있다 그것. 예를 들어, Simple Injector가 DbContext를 만들고 처리 할 수는 있지만 SubmitChanges는 어디에서 호출합니까? 웹 요청이 끝날 때이를 수행하는 것은 꽤 나쁜 생각입니다. 내가 찾은 유일한 편리한 솔루션은 더 솔리드 아키텍처로 이동하는 것입니다. 예를 들어, this question을 살펴보십시오.

+0

고마워요! 현재의 아키텍처에 가까운 SOLID 아키텍처를 추천 해 주시겠습니까? ('BLL'은 리포지토리를 통해'DAL'과 이야기하고'MVC'는 간단한 인젝터를 사용하여'BLL'과 대화하고 있습니다) – jony89

+0

@ jony89 : 5 가지의 솔리드 원리를 연구하십시오. 그들은 3 계층 아키텍처와 같은 다른 아키텍처 스타일보다 훨씬 중요한 지침을 제공합니다.추상화를 프로그래밍하고, 클래스의 책임을 제한하며, 기능을 추가 할 때 클래스를 변경하지 않아도됩니다. – Steven