2011-08-12 3 views
3

봄을 사용하여 xml 구성에서 predicate 및 func 객체를 포함하는 생성자로 객체를 만들고 싶습니다. Predicate 및 Func 인수는 다른 구성된 오브젝트의 메소드를 가리켜 야합니다. Spring.net을 사용하면 어떻게 가능합니까?Predicate와 Func을 Spring.net에 삽입하는 방법

MyClass(Predicate<TInput> condition, Func<TInput, TOutput> result) 

답변

0

나는 thekip의 제안에서 영감을 얻었지만, 위의 예제에서 MyClass의 constructor에 술어와 func를 요구하는 객체를 그대로두고 중간 "factory"를 사용하여 문제를 해결했다. 이 솔루션은 MyClass를 구현하지 않은 봄에 대리인을 처리하는 "문제"를 발생시킵니다 (킵의 제안과는 반대이지만 답변에 감사드립니다).

다음은 그러한 상황을 구성하는 나의 방법입니다 (객체 기반 팩토리 패턴을 사용하여 Spring.Net에서 델리게이트를 설정 함).

조건/FUNC에 대한 샘플 구현 를 사용하는 MyDelegator 클래스 (여기에 반대하지만, 술어/FUNC의 PARAMS에 맞는 다른 어떤 수) :

public class MyDelegator 
{ 
    // for the predicate Predicate<TInput> condition, implemented with object 
    public bool Condition(object input) 
    { 
     ... 
    } 

    //for the Func<TInput, TOutput> result, implemented with object 
    public object Evaluate(object input) 
    { 
     ... 
    } 
} 

을 ... 당신은 용기가 필요합니다 술어 및 또는 FUNC와 개체에 대한 ( 너무 별도의 클래스에있을 수 있습니다) ...

public class MySpringConfigurationDelegateObjectContainer 
{ 
    private readonly Predicate<object> condition; 
    private readonly Func<object, object> evaluate; 

    public MySpringConfigurationDelegateObjectContainer(MyDelegator strategy) 
    { 
     condition = strategy.Condition; 
     evaluate = strategy.Evaluate; 
    } 

    public Predicate<object> GetConditionMethod() 
    { 
     return condition; 
    } 

    public Func<object, object> GetEvaluateMethod() 
    { 
     return evaluate; 
    } 
} 

... 이것은 Spring.Net XML의이 방법

을 구성 할 수 있습니다
<!-- a simple container class, just has the object with the method to call --> 
    <object id="Container" type="MySpringConfigurationDelegateObjectContainer"> 
    <constructor-arg name="myDelegateObject"> 
     <!-- put the object with the delegate/func/predicate here --> 
     <object type="MyDelegator" /> 
    </constructor-arg> 
    </object> 

그리고 지금 당신은 술어/FUNC 그것 뿐이다

<object id="NeedAPredicateAndFuncInConstructor" type="..."> 
    ... 
    <constructor-arg name="condition"> 
     <object factory-method="GetConditionMethod" factory-object="Container" /> 
    </constructor-arg> 
    <constructor-arg name="result"> 
     <object factory-method="GetEvaluateMethod" factory-object="Container" /> 
    </constructor-arg> 
    ... 
    </object> 

(술어/FUNC을 필요로하는 클래스를 변경할 필요)와 객체에 대한 설정이 어디에서나 사용할 수 있습니다. 이 솔루션을 개선하기위한 제안 사항이 있습니까? 어쩌면, Spring.net 이미이에 대한 일반적인 솔루션 ...

+0

ouch .. 현재 Func 을 사용하는 스프링 기반 공장에 대한 일반적인 지원을 찾고 있는데, 스프링의 이러한 고급 시나리오에 대한 유일한 해결책은 최대한 빨리 봄을 없애는 것입니다. 몇 가지 실제 컨테이너 (예 : Windsor)를 사용하기 시작하십시오. :) – Buthrakaur

+0

@Buthrakaur Spring.net이 앞으로 이것을 지원할 것입니다. 아마도 spring.net에서 표현식을 사용하여 이것을 해결할 수있는 또 다른 방법이 있습니다. – Beachwalker

2

나는 당신이 조건과 기능을 추출하고 뒤에 넣어해야 말할 것입니다 : 나는 샘플 생성자가 될 것

... 문서의 솔루션이나 힌트를 찾을 수 없습니다 인터페이스. 그런 다음 생성자에서이 인터페이스를 사용할 수 있습니다. 당신이 사용하는 생성자가 대부분의 시간에 주입한다면 당신은 의존성을 인터페이스 나 타입으로 지정해야한다. 예제의 생성자는 2 개의 인스턴스 변수를 사용합니다 (이 경우 메서드를 가리킴).

public interface IInterface<TInput, TOutput> 
{ 
    bool GetOutput(TInput item); 
    TOutput GetResult(TInput item); 
} 

을 그리고 당신이 '다른 구성 객체,이 인터페이스를 구현을 가질 수로 동일한 결과를 제공 생성자 PARAM 등이 인터페이스를 사용

이 같은 인터페이스를 만들 수 있습니다.

+0

이것은 옵션 인 것처럼 보이지만 인터페이스가 필요하지 않은 추가 인터페이스를 정의해야합니다.또한 이것은 직접적인 해결책이 아니며 대신에 더 많은 복잡성을 추가합니다. 난 그냥 대리자/메서드 (포인터) 생성자/속성 주입을 사용하고 싶습니다. 이 코드를 연결하는 것은 매우 쉽지만 봄에 어떻게 작동하는지 전혀 알 수 없습니다. – Beachwalker

+1

필요 없다는 것은 무엇을 의미합니까? 종속성을 설명하는 인터페이스를 갖는 것이 기능 만있는 것보다 훨씬 낫습니다. 의존성이 무엇인지, 그리고 주입 된 함수를 호출하는 것보다는 함수가 무엇을하는지 설명하기 위해 인터페이스를 사용해야한다. 인터페이스는 추상화를 명확하게하고 종속성이 무엇인지 알려줍니다. – thekip

+0

...이 방법으로 인터페이스를 사용하면 문제가 해결되지 않습니다. 봄에 func 매개 변수를 정의하는 방법. 이렇게하면 생성자 인수로 객체가 있고 Get * -Methods가 어떤 것을 반환 할 수있는 클래스를 만드는 옵션이 제공됩니다. 이 코드는 전략 구현을 침범 할 것입니다. – Beachwalker

3

을 가지고 대표 (액션, Func을, 술어는 특별 대표이다)을 만들 Spring.net 내 DelegateFactoryObject를 사용하는 것도 가능하다 :

<object type="Spring.Objects.Factory.Config.DelegateFactoryObject, Spring.Core"> 
    <property name="DelegateType" value="System.Action"/> 
    <property name="TargetObject" ref="MyTarget" /> 
    <property name="MethodName" value="MyDelegate" /> 
    </object> 

따라서 위에서 설명한 MySpringConfigurationDelegateObjectContainer와 같은 생성자를 만들어서 더 이상 팩토리 메서드를 통해 대리자를 전달하지 않아도됩니다.