2016-08-05 11 views
2

나는 시작한 젊은 개발자이며, 나는 의존성 주입을 배우는 중이고 저를 괴롭히는 질문이 있습니다.IoC 컨테이너? (정적 클래스에 반대)

예를 들어 WCF 서비스 웹 (비누)이 있는데 간단한 비즈니스 조치를 수행하고 데이터베이스를 호출합니다.

그래서, 내 프로젝트는

서비스로 절단 -> 비즈니스 레이어 -> 레이어 데이터 액세스 -> 데이터베이스 내 경우에는

는 비즈니스 계층과에서 SELECT 한 Statment 간단한 비즈니스 활동이있다 데이터 액세스 계층. 요약

:

서비스 레이어 :

public void GetData() 
     { 
      BusinessLayer.GetData(); 
     } 

비즈니스 층 :

static class BusinessLayer 
    { 
     public static void GetData() 
     { 
      //If something or something else ... 
      DataAccessLayer.GetData(); 
     } 
    } 

는 이제 (확실히 잘못된 방향으로) 내 층 사이의 통신에 정적 클래스를 사용

데이터 액세스 계층 :

static class DataAccessLayer 
    { 
     public static void GetData() 
     { 
      //DO insert in database 
     } 
    } 

우선이 방법이 좋지 않습니까?

그러면 매우 간단한이 경우 IoC 컨테이너를 설치하는 것이 좋습니다.

미리 감사드립니다.

PS : 제 영어

+1

질문의 전제가 유효하지 않는 것 같습니다. 의존성 주입을하기 위해 IoC 컨테이너가 필요하지 않기 때문에 정적 클래스 대 IoC 컨테이너가 아닙니다. –

+0

는 이럴 그것은 어떻게 어떤 회사가하고있는에 더 의존한다. 그리고 얼마나 빨리 IOC의이 IOC는 전혀 옵션이 아닌 경우 아주 간단한 시나리오, 경우도 있습니다 사용할 때 그들은 개발의 방향)의 경우가 있습니다를 변경하지. –

+1

이 질문은 상당히 폭넓게 보입니다. 따라서 아마도 닫힐 것입니다. 콘테이너는 신경 쓰지 말고 클래스의 실제 디자인을 고려해야합니다. . 당신은 일반적으로 "클래스의 실제 인스턴스의 독립적 인 존재 물건을 언급 static' 그러나 나는 비즈니스 층은 1이 가정'로 : 데이터 액세스 레이어 1-관계를, 그것을 나던 그래서 마키는 thjis? 모든 인스턴스와 멋져요 완료. 용기를 사용하는 경우 – HimBromBeere

답변

0

죄송합니다 나는 당신의 레이어 클래스에서 인터페이스를 만들 것입니다. 이것은 필요에 따라 정적 클래스를 제거하고 사용자에게 주입을 설정합니다. 귀하의 예를 들어, 어느 작은, 나는 경험을 통해 학습 경험으로하지 않는 것이 좋습니다 것이 좋습니다. 이 주입을 언제 사용할 지에 대한 엄격한 규칙은 없지만 단위 테스트가 시작될 때 패턴이 크게 도움이됩니다.

"와우! 정적 테스트 방법이나 싱글 톤 테스트의 경우 단위 테스트를 작성하는 것이 훨씬 쉽습니다."

결국에는 삽입 할 기능에 대한 인터페이스 라인이 생깁니다. 이것은 도메인 모델의 일부 레벨이 존재하고 데이터베이스의 원시 데이터가 모델로 변환 될 것이라고 가정합니다.

먼저 종속 클래스에 주입해야하는 다양한 인터페이스를 정의합니다.

public interface IBusinessLayer 
{ 
    Data GetData(); 
} 

public interface IDataAccessLayer 
{ 
    Data GetData(); 
} 

public interface IDatabase 
{ 
    DbData GetDatabaseData(); 
} 

주요 목표는 컨테이너가 원하는 작업을 완료하기위한 funcitonality를 주입하도록하는 것입니다. 여기에서 데이터를 가져 오는 중입니다. 데이터가 도메인 모델의 클래스라고 가정합니다.

public class ServiceLayer 
{ 
    IBusinessLayer business = null; 

    public ServiceLayer(IBusinessLayer business) 
    { 
     this.business = business; 
    } 

    public void GetData() 
    { 
     Data data = business.GetData(); 
     // do something with data 
    } 
} 

다른 레이어에 대해 동일한 패턴을 반복 할 수 있습니다. 이 간단한 응용 프로그램에 대한 작업이 많은 것처럼 보이지만 인터페이스에 의해 제공되는 하드 에지는 인터페이스 계약이 남아있는 한 각 레이어가 자체적으로 개발할 수있게합니다.당신이 명확하게 정의 된 레이어를 유지하는 경우

인종 차별은 좋은 것입니다. 예를 들어, 원시 데이터베이스 데이터, 행 등을 상위 계층으로 블리딩하지 않도록합니다.

공용 클래스 BusinessLayer : IBusinessLayer { IDataAccessLayer dataAccess = null;

// container will inject data access layer 
    public BusinessLayer(IDataAccessLayer dataAccess) 
    { 
     this.dataAccess = dataAccess; 
    } 

    public Data GetData() 
    { 
     Data data = dataAccess.GetData(); 
     // do something with data? 
     return data; 
    } 
} 

// Retruns typed data business layer 
public class DataAccessLayer : IDataAccessLayer 
{ 
    IDatabase db = null; 

    public DataAccessLayer(IDatabase db) 
    { 
     this.db = db; 
    } 

    public Data GetData() 
    { 
     var db_data = db.GetDatabaseData(); 
     Data data = /*convert raw db_data -> type domain data*/ 
     return data; 
    } 
}