1

나는 오버로드 된 생성자가있는 서비스 클래스가 있습니다. 한 생성자는 5 개 매개 변수를 가지고 있으며, 다른 하나는IoC.Resolve를 사용할 때 클래스의 조건부 생성이 가능합니까?

var service = IoC.Resolve<IService>(); 

내가 테스트를하고이 테스트의 결과에 따라 원하는 특정 생성자를 사용하여 서비스를 해결 내가 전화하기 전에 4.

을 가지고 있습니다. 즉,

 bool testPassed = CheckCertainConditions(); 
     if (testPassed) 
     { 
      //Resolve service using 5 paramater constructor 
     } 
     else 
     { 
      //Resolve service using 4 parameter constructor 
      //If I use 5 parameter constructor under these conditions I will have epic fail. 
     } 

사용할 수있는 방법을 지정할 수 있습니까? 당신은 본질적으로 은 '당신이 하나를 사용하는 경우 정말 상관 없어 나 다른' 것을 모든 호출 말하는 있기 때문에 DI에 관해서

+1

'DynamicParameters'를 사용하는 것이 가능하지만 사용하기 전에 먼저 왜 필요합니까?그것은 당신의 코드에서 디자인 결함처럼 들린다. –

답변

0

내 기본 문제는 다음과 같은 서명했다 내 수업 해결하려고했던 것이 었습니다 : 내 usersessionmanager가 활성 NHibernate.ISession 없었기 때문에

public DatabaseSchemaSynchronisationService(IDatabaseService databaseService, IUserSessionManager userSessionManager) 

이 나에게 기본적으로 쓸모가 없었습니다을 때문에 내 데이터베이스에 연결 아직 만들어지지 않았다. 내가하려고했던 것은 데이터베이스에 연결 스크립트가 있는지 확인한 다음 데이터베이스 업데이트 스크립트를 실행하는 서비스로 사용되는이 클래스를 해결하는 것입니다.

다른 방법으로 스크립트를 수행하기 위해 내 모든 클래스를 변경, 나는 그것의 생성자의 서명에 필요한 모든했다 :

public DatabaseSchemaSynchronisationService(ISessionFactory sessionFactory) 

이것은 내 자신의 세션을 열 수있었습니다. 그러나 먼저 클래스 연결을 시도하기 전에 연결이 준비되었는지 확인해야하지만 다른 클래스의 생성자에 대한 매개 변수로 IDatabaseSchemaSynchronisationService가 있어야합니다. 이 클래스는 또한 gettting 어딘가에 어디 데이터베이스 연결을 확인하지 못했습니다 나쁜 생각했다.

대신이 두 번째 수업 시간에, 내가 생성자 서명 밖으로 IDatabaseSchemaSynchronisationService의 paramater를 가져다가 그 유일한 인스턴스 (해결)됩니다 지역 변수했다 : 대답 모든 사람에게

if (connectionIsReady) 

감사합니다.

2

일반적으로, 당신은 생성자의 모호성 조심해야한다. 이것은 의도 한 바가 아닐 것입니다.

그러나 한 container-agnostic 솔루션은 동일한 인터페이스를 구현하는 다른 클래스에 조건 구현을 래핑하는 것입니다 : 생성자에서 CheckCertainConditions 검사를 수행 할 수없는 경우

public class ConditionalService : IService 
{ 
    private readonly IService service; 

    public ConditionalService() 
    { 
     bool testPassed = CheckCertainConditions();  
     if (testPassed)  
     {  
      // assign this.service using 5 paramater constructor  
     }  
     else  
     {  
      // assign this.service using 4 parameter constructor 
     } 
    } 

    // assuming that IService has a Foo method: 
    public IBaz Foo(IBar bar) 
    { 
     return this.service.Foo(bar); 
    } 
} 

을, 당신은 게으른 평가를 사용할 수 있습니다 대신

ConditionalService가 생성자 삽입을 통해 모든 종속성을 요청하도록하는 것이 좋지만 예제 코드에서는이를 제외 시켰습니다.

실제 구현 대신 DI 컨테이너에 ConditionalService를 등록 할 수 있습니다.