Castle Windsor를 사용하여 정수를 기록하는 클래스를 만들고 싶습니다. 하지만 다른 클래스와 함께 여러 번 꾸미고 싶습니다. 관련된 모든 Concret에 해결할 수있는 종속성이있는 경우 이것이 작동하는 방식을 볼 수 있지만 여기서는 그렇지 않습니다. ModelUpdatingRecorder
가 아닌 선택적 종속성이 있기 때문에, IRecorder
여기서 일하지 않습니다 해결다른 생성자 인수가있는 장식 자
container.Register(Component.For<IRecorder>().ImplementedBy<NotifyingRecorder>());
container.Register(Component.For<IRecorder>().ImplementedBy<ModelUpdatingRecorder>());
:
public interface IRecorder
{
void Add(int value);
}
public class NotifyingRecorder : IRecorder
{
readonly IRecorder decoratedRecorder;
public NotifyingRecorder(IRecorder decoratedRecorder)
{
this.decoratedRecorder = decoratedRecorder;
}
public void Add(int value)
{
decoratedRecorder.Add(value);
System.Console.WriteLine("Added " + value);
}
}
public class ModelUpdatingRecorder : IRecorder
{
int seed;
public ModelUpdatingRecorder(int seed)
{
this.seed = seed;
}
public void Add(int value)
{
seed += value;
}
}
그리고 등록 :이 코드를 생각해 보자. seed
은 컴파일시 알 수 없기 때문에 정적 종속성을 사용할 수 없습니다.
런타임에 seed
매개 변수를 지정하고 장식을 여전히 사용할 수 있습니까?
이 코드 샘플은 제 시나리오를 단순화 한 것이지만 아이디어는 같습니다. 필자는 데코레이터를 사용하고, 가장 낮은 디자이너는 데 이터/인스턴스를 제공해야한다.
그래서 데코레이터를 제쳐두고 런타임에 종속성을 어떻게 제공하겠습니까? –
@PhilDegenhardt 일반적으로 [Typed Factory Facility] (http://docs.castleproject.org/Default.aspx?Page=Typed-Factory-Facility-interface-based-factories&NS=Windsor)의 공장을 통해. –
까지 런타임에서 비 선택적 종속성을 제공하는 것이 팩토리 메서드를 통해 수행 될 수도 있고 컨테이너를 연결하여 종속성이 일부 전역 (정적) 저장소를 통해 검색되도록 할 수도 있습니다. 내가 아는 한, 후자는 해결되는 구성 요소의 하위 종속성에 종속성이있는 경우 유일하게 사용 가능한 메커니즘입니다. 현명한 머리카락이 내 생각보다 더 낫다.이 질문을 관심과 함께 보게 될 것이다. –