Castle Windsor : 공장에서 만든 객체의 원형 참조를 방지하는 방법은 생성 된 개체가 공장을 다시 언급했습니다.

StackOverflow https://stackoverflow.com/questions/487786

문제

나는 Windsor Castle을 내 IOC 컨테이너로 사용하고 있으며 약간의 문제를 해결했습니다. 이것은 코드에서 가장 잘 설명되어 있으므로 시도해 볼 것입니다. 공장 수업이있어 특정 인터페이스의 구현을 제공해야합니다.

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}

공장 클래스의 구현은 다음과 같이 보일 수 있지만, 이것이가는 길은 확실하지 않습니다 : public interface objectCreatorFactory : iobjectCreatorFactory {ienumerable speciescreators; iObjectCreator defaultCreator;

    public ObjectCreatorFactory(IEnumerable<IObjectCreator> specificCreators, IObjectCreator defaultCreator)
    {
        this.specificCreators= specificCreators;
        this.defaultCreator= defaultCreator;
    }
    public IObjectCreator GetObjectCreator(Type objectType)
    {
        foreach (IObjectCreator creator in specificCreators)
        {
            if (creator.SupportsType(objectType))
            {
                return creator;
            }
        }
        return defaultCreator;
    }
}

이제 이것은 괜찮을 것입니다. 그러나 iobjectCreator 인스턴스 인스턴스가 특정 iobjectCreator를 사용하여 자식 객체를 만들기를 원한다면 ObjectCreatorFactory를 호출하고 싶습니다.

public void SpecificObjectCreator:IObjectCreator
{
    IObjectCreatorFactory objCreatorFactory;
    public SpecificObjectCreator(IObjectCreatorFactory objCreatorFactory)
    {
        this.objCreatorFactory = objCreatorFactory;
    }
    T CreateObject<T>(IDataRow data)
    {
        T obj = new T;
        ChildObject childObject = objCreatorFactory.GetObjectCreator(typeof(ChildObject)).CreateObject<ChildObject>(data);
         .......
    }
    bool SupportsType(Type type);        
}

이것은 작동하지 않습니다. 생성 된 객체가 아동 객체 제작자를 위해 공장을 다시 언급하는이 시나리오로가는 방법은 무엇입니까?

도움이 되었습니까?

해결책

나는 단순히 다양한 특정 객체 제작자의 생성자에서 공장을 옮기고 대신 iobjectCreator 인터페이스에 메소드를 소개하여 제작자를 초기화 할 책임이 있습니다.

public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
    void Initialize(IObjectCreatorFactory factory);
}

그런 다음 각 객체 제작자에서 Initialze (this)를 호출하여 공장으로 전달했습니다.

과거에는 Custom Life Cycle Stage를 사용하여 원형 의존성을 피하고 다른 관련 문제를 처리하기 위해 "건설 후"구성 요소 설정을 자동으로 호출하는 것을 관리했습니다 (즉, 외부 소스에서 추가 구성 요소 구성을 적용하는 것. 데이터베이스) - 그러나 필요한 것은 아마도 과잉 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top