2010-08-13 4 views
2

나는 추상 팩토리 패턴을 사용하는 응용 프로그램을 구축하여 IHardwareDevice의 하위 클래스가 식별 요청에 응답하는 방법에 따라 런타임 결정을 내릴 수 있도록합니다. Hardware1 또는 Hardware2를 만들 수 있습니다.IoC의 중단 된 체인

이 IHardwareDevice 개체에 State 패턴을 사용하고 IoC 컨테이너에서 State를 생성하려고 할 때 문제가 발생합니다. IoC 컨테이너를 직접 호출하지 않고 IHardwareDevice를 수화하는 State 개체를 해결하지 않고이 작업을 수행하는 좋은 방법이 있습니까?

아니면 내가 잘못 생각하고 있습니까? My Factory는이 라이브러리의 엔트리 포인트이기 때문에이 팩토리가 라이브러리에서 사용하기 위해 컨테이너를 인스턴스화하는 것은 괜찮습니까? 클라이언트 응용 프로그램을 사용하여 컨테이너를 인스턴스화 한 다음 팩터 리와 같이 라이브러리의 어느 부분에 액세스 할 수 있는지 계획하고있었습니다.

저는 윈저를 IoC 컨테이너로 사용할 계획이지만, 필요한 경우 전환 할 수있는 프로젝트 초기 단계에 있습니다.

+0

"IoC 컨테이너에서 국가를 생성하게하고 싶습니다"라는 의미는 무엇입니까? –

+0

Factory 객체를 인스턴스화하여 State 객체에 전달하는 대신 State 객체가 IoC 컨테이너에 의해 충족되어야하는 모든 의존성을 원한다는 것을 의미합니다. – Darran

답변

0

윈저 자동 구현 추상적 인 공장에 대한 매우 강력한 기능이 있습니다 - 그것은 크게 규칙 기반 Typed Factory Facility

, 그리고 기본 규칙은 사용자의 요구에 맞게하지 않는 경우, 당신은 다음과 같은 기능을 제공하여이를 대체 할 수 있습니다 맞춤 ITypedFactoryComponentSelector

결정을 내리는 데 필요한 정보 - 호출 레인을 통과 할 인라인 인수와 해결할 구성 요소 -에 액세스 할 수 있습니다.

2

Windsor를 포함한 대부분의 IoC 컨테이너에는 명시 적 종속성 (매개 변수)을 해결 된 종속성의 생성자에 전달할 수있는 옵션이 있습니다. Resolve 메서드를 호출 할 때

그렇습니다. 해결중인 IHardwareDevice 인스턴스에 State 개체를 명시 적으로 전달할 수 있습니다. (일부 가능성이 값을 구성하는) 상태를 구별하는

첫째, 열거 : 다음

public enum DeviceState { Online, Offline } 

, 국가 구현

+0

컨테이너를 직접 참조하고 내 라이브러리에서 Resolve를 호출하지 않아도되는 것이 이상적입니다. Typed Factory Facility를 시험해 볼 것이고 그것이 저를 위해 작동하지 않는다면이 옵션으로 돌아갈 것입니다. 감사! – Darran

3

여기가 Autofac 2.2 (http://autofac.org)와 함께 할 수있는 하나의 방법입니다 , 같은

01 :

public class OnlineState : IDeviceState { } 

다음에, 해당 ENUM 키 각각의 상태를 등록

var builder = new ContainerBuilder(); 
builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online); 
builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState.Offline); 
// Register other components here 

마지막으로 하드웨어 장치는 인덱스를 사용하여 상태를 선택합니다. 컨테이너에 의해 IIndex 구현이 자동으로 제공됩니다.

public class Modem : IHardwareDevice 
{ 
    IIndex<DeviceState, IDeviceState> _states; 
    IDeviceState _currentState; 

    public Modem(IIndex<DeviceState, IDeviceState> states) 
    { 
     _states = states; 
     SwitchOn(); 
    } 

    void SwitchOn() 
    { 
     _currentState = _states[DeviceState.Online]; 
    } 
} 

희망이 있습니다.