2011-08-03 3 views
0

을 무시하는 나는 다음과 같은 인터페이스와 클래스가 :어떻게 객체를 구성하고 그 구성

public interface ILoggingService { ... } 
public class LoggingService { 
    public LoggingService(ILoggingRepository loggingRepository) { ... } 
    ... 
} 

public interface ILoggingRepository { ... } 
public class DatabaseLoggingRepository { 
    public DatabaseLoggingRepository(string ConnectionString) { ... } 
    ... 
} 
public class FileLoggingRepository { 
    public FileLoggingRepository(string LogFilePath) { ... } 
    ... 
} 

내가 유니티 IOC의 프레임 워크를 이용할 수 있도록 소프트웨어를 리팩토링하고있어에 특정 구성을 전달하는 방법을 찾고 있어요 각 ILoggingRepository 구현.

필자는 DatabaseLoggingRepository 및 FileLoggingRepository의 생성자를 매개 변수가없는 것으로 변경하고 일부 구성 파일로 구성하는 것이 가장 좋은 방법이라고 생각합니다. 그러나 수락 테스트로 인해 테스트를 실행하는 동안 이러한 설정을 무시할 수있는 쉬운 방법이 필요합니다.

맞습니다. 올바른 트랙에 있고 어떤 설정 파일을 사용해야합니까? 다른 방법도 환영합니다.

+0

처음 두 생각은 다음과 같습니다. 디버그 및 릴리스 빌드에 대한 별도의 구성 파일이 있어야합니다. 비. 전처리 지시어를 사용하여 사용할 구성을 결정하십시오 :'#if DEBUG''// 디버그 설정 사용'# else''// 공식 설정'#endif' 사용 –

+0

이것은 ** 가까이 있지 않습니다 ** 적절한 IoC 솔루션. 그 밖의 것이 없다면 디버그 또는 릴리스 구성에서 실행 중인지 여부에 관계없이 단위 테스트를 성공적으로 수행하고 싶습니다. –

+0

불행히도 동일한 테스트 픽스처를 실행하는 동안이 두 가지 설정이 필요합니다. 첫 번째 테스트에서는 올바른 ConnectionString을 사용하여 동작을 테스트하고 잘못된 ConnectionString을 사용하여 다음 테스트를 실행합니다. –

답변

2

우리가 결정한 것은 클래스를 생성하는 것입니다. 귀하의 경우에는 LoggingConfiguration이되고 저장소의 생성자로 전달되어야합니다. Unity를 사용하여 해결하면 Activator을 사용하여이 클래스를 인스턴스화합니다. wuthout이이를 등록해야합니다. 그러나 테스트에서 파생 된 구성 클래스의 새 인스턴스를 greate하여 다른 값을 제공합니다.

의미가 있습니까? 더 자세히 설명해야합니까?

업데이트 : 몇 가지 추가 설명을하기로했습니다. 따라서 이미 두 가지 구현이 있으며 각 구성에서 적절한 구성 설정을 쿼리해야합니다.

내가 같이하는 ILoggingRepository의 생성자를 확장 할 것입니다 : 당신은 다음 두 가지 속성이있는 정상적인 작동을 위해 하나의 구현을 만들 수 있습니다

public ILoggingRepository(ILoggingConfigurationProvider confProvider); 

:

public LoggingConfigurationProvider : ILoggingConfigurationProvider { 
public LoggingConfigurationProvider() { 
    // load both values from configuration file 
} 

public string LogPath { get; set; } 
public string ConnectionString { get; set; } 
} 

당신이 인스턴스화하여 클래스에서 정상적인 IoC 작업을 통해 컨테이너에 의해 해결되고 구성 옵션은 conf 파일에서로드됩니다. 당신은 그러나 단위 테스트 당신이하고 싶은 경우 :

new LoggingRepository(new MockLoggingConfigurationProvider()); 

또는 경우 :

1) 새로운 "모의"구현 이제

public class MockLoggingConfigurationProvider : ILoggingConfigurationProvider { 
    public MockLoggingConfigurationProvider() { 
     // set both values to a test value 
    } 

    public string LogPath { get; set; } 
    public string ConnectionString { get; set; } 
} 

만들기 당신도 할 수있는 생성자를 사용하여 저장소를 작성 전체 IoC 메커니즘을 사용하기를 원한다면 컨테이너의 설정시 인터페이스의 구현을 등록하면된다. 단위 테스트가 별도이므로 등록을 공유하지 않아도됩니까? 그래서 당신이 필요로하는 것들, 단위 테스트로 실행되는 날씨에 따라이 설정을 변경할 수있는 능력을 제공해야합니다.

실생활에서 나는 이것조차 신경 쓰지 않을 것이고 단지 모의 로깅 저장소를 만들고 다른 곳에 쓰도록 할 것이다. 리포지토리를 테스트 데이터베이스/파일로 테스트하지 않는 한. 어떤 경우에는 지정된대로 할 것입니다.

희망이 있습니다.

+0

시간을 절약 할 수 있다면 더 정교한 설명이 좋을 것입니다. –

+0

답변을 업데이트합니다. –

0

디자인 제안으로 인해 IoC는 구성을 처리하지 않습니다.각 로거는 구현시 선호하는 방식으로 구성을 관리해야합니다. IoC는 로거를 주입해야합니다. 단위/통합 테스트의 경우, 두 경우 모두 log4net을 사용하여 로거에 대한 구성을 제공 할 수 있어야합니다. API로 테스트 시작시 로깅 하위 시스템을 구성하는 데 사용되며, appender를 만듭니다 그것은 콘솔에 단지 everithing을 씁니다. 가능한 각 로깅 시스템이 구성 부분에 대한 계약을 공유 할 필요가 없기 때문에 IoC에 의한 구성을 일일이 구성 할 수 없습니다.

관련 문제