1

여러 데이터베이스 연결을 사용하는 응용 프로그램이 있습니다. 캐슬 윈저의 형식화 된 팩토리 지원을 사용하여 IDbConnection의 인스턴스를 내 저장소 및 기타 구성 요소로 반환하는 팩토리를 주입하고 싶습니다.구성 요소 별 Castle Windsor 유형 공장

public interface IConnectionFactory 
{ 
    IDbConnection CreateConnection(); 
} 

그리고 여기 샘플 저장소입니다 :

public class AccountRepository 
{ 
    private readonly IConnectionFactory connectionFactory; 

    public AccountRepository(IConnectionFactory connectionFactory) 
    { 
     this.connectionFactory = connectionFactory; 
    } 

    public Account FindAccountById(int id) 
    { 
     using (var connection = connectionFactory.CreateConnection()) 
     { 
      // TODO use the connection here 
     } 
    } 
} 

그리고 내 구성 요소 등록 발췌 :

// ... 

container.Register(Component.For<IDbConnection>() 
    .ImplementedBy<NpgsqlConnection>() 
    .LifestyleTransient()); 

container.Register(Component.For<IConnectionFactory>() 
    .AsFactory()); 

// ... 

내 입력 된 공장 인터페이스가 보이는 방법은 다음과

입니다 내 IDbConnection은 모두 같은 유형 (NpgsqlConnection),하지만 필자는 여러 연결 문자열을 사용해야합니다. 이상적으로, 난 종속성으로 IConnectionFactory을 가진 구성 요소에 따라 나를 위해 IDbConnection (또는 연결 생성자로 전달)에 연결 문자열을 설정 윈저 설치하고 싶습니다. 예를 들어

:

  • 내가 자신의 생성자에서 종속성으로 IConnectionFactory을 두 저장소, AccountRepositoryItemRepository을 말해봐.
  • foobar이라는 두 개의 연결 문자열이 있다고 가정 해 보겠습니다.
  • AccountRepositoryIConnectionFactory.CreateConnection() 인 경우 foo을 사용하여 IDbConnection을 반환하고 싶습니다.
  • ItemRepositoryIConnectionFactory.CreateConnection() 인 경우 bar을 사용하여 IDbConnection을 반환하고 싶습니다.

Castle Windsor에서 가능한가요?

이 주제를 연구했지만 필자의 정확한 시나리오에 맞는 솔루션을 찾지 못했습니다. 이상적으로, 내가 사용하는 정확한 연결 문자열의 무지 내 저장소를 유지하려는, 즉 I 가 내 연결 팩토리를 변경하지 않으 : 나는 또한 모든 문서를 읽은

public interface IConnectionFactory 
{ 
    IDbConnection CreateConnection(string connectionStringName); 
} 

및 기사 내가 ISubDependencyResolverITypedFactoryComponentSelector에서 찾을 수 있지만이 시나리오에 적용 할 수 있는지 또는 모든 것을 함께 조각하는지 잘 모르겠습니다.

그런데 Castle Windsor 3.1과 .NET 4.0을 사용하고 있습니다.

+1

겠습니까라는 이름의 구성 요소는 당신이 원하는 무엇을주는?나는 이것이 당신이 등록 시간에 특정 의존성을 표현할 수 있다고 생각한다. –

답변

0

은 어쩌면 실제 공장을 사용하고, 하나의 입력하지 :

public ConnectionAFactory : IConnectionFactory 
{ 
    public ConnectionAFactory() 
    { 
      this.connectionString = "foo"; 
    } 
} 

를 그리고 정확한 저장소와 윈저에 등록 :

Component.For<AccountRepository>() 
    .DependsOn(
     ServiceOverride.ForKey<IConnectionFactory>().Eq(typeof(ConnectionAFactory))); 
관련 문제