봄을 사용하여 xml 구성에서 predicate 및 func 객체를 포함하는 생성자로 객체를 만들고 싶습니다. Predicate 및 Func 인수는 다른 구성된 오브젝트의 메소드를 가리켜 야합니다. Spring.net을 사용하면 어떻게 가능합니까?Predicate와 Func을 Spring.net에 삽입하는 방법
MyClass(Predicate<TInput> condition, Func<TInput, TOutput> result)
봄을 사용하여 xml 구성에서 predicate 및 func 객체를 포함하는 생성자로 객체를 만들고 싶습니다. Predicate 및 Func 인수는 다른 구성된 오브젝트의 메소드를 가리켜 야합니다. Spring.net을 사용하면 어떻게 가능합니까?Predicate와 Func을 Spring.net에 삽입하는 방법
MyClass(Predicate<TInput> condition, Func<TInput, TOutput> result)
나는 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 이미이에 대한 일반적인 솔루션 ...
나는 당신이 조건과 기능을 추출하고 뒤에 넣어해야 말할 것입니다 : 나는 샘플 생성자가 될 것
... 문서의 솔루션이나 힌트를 찾을 수 없습니다 인터페이스. 그런 다음 생성자에서이 인터페이스를 사용할 수 있습니다. 당신이 사용하는 생성자가 대부분의 시간에 주입한다면 당신은 의존성을 인터페이스 나 타입으로 지정해야한다. 예제의 생성자는 2 개의 인스턴스 변수를 사용합니다 (이 경우 메서드를 가리킴).
public interface IInterface<TInput, TOutput>
{
bool GetOutput(TInput item);
TOutput GetResult(TInput item);
}
을 그리고 당신이 '다른 구성 객체,이 인터페이스를 구현을 가질 수로 동일한 결과를 제공 생성자 PARAM 등이 인터페이스를 사용
이 같은 인터페이스를 만들 수 있습니다.
이것은 옵션 인 것처럼 보이지만 인터페이스가 필요하지 않은 추가 인터페이스를 정의해야합니다.또한 이것은 직접적인 해결책이 아니며 대신에 더 많은 복잡성을 추가합니다. 난 그냥 대리자/메서드 (포인터) 생성자/속성 주입을 사용하고 싶습니다. 이 코드를 연결하는 것은 매우 쉽지만 봄에 어떻게 작동하는지 전혀 알 수 없습니다. – Beachwalker
필요 없다는 것은 무엇을 의미합니까? 종속성을 설명하는 인터페이스를 갖는 것이 기능 만있는 것보다 훨씬 낫습니다. 의존성이 무엇인지, 그리고 주입 된 함수를 호출하는 것보다는 함수가 무엇을하는지 설명하기 위해 인터페이스를 사용해야한다. 인터페이스는 추상화를 명확하게하고 종속성이 무엇인지 알려줍니다. – thekip
...이 방법으로 인터페이스를 사용하면 문제가 해결되지 않습니다. 봄에 func 매개 변수를 정의하는 방법. 이렇게하면 생성자 인수로 객체가 있고 Get * -Methods가 어떤 것을 반환 할 수있는 클래스를 만드는 옵션이 제공됩니다. 이 코드는 전략 구현을 침범 할 것입니다. – Beachwalker
을 가지고 대표 (액션, 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와 같은 생성자를 만들어서 더 이상 팩토리 메서드를 통해 대리자를 전달하지 않아도됩니다.
ouch .. 현재 Func을 사용하는 스프링 기반 공장에 대한 일반적인 지원을 찾고 있는데, 스프링의 이러한 고급 시나리오에 대한 유일한 해결책은 최대한 빨리 봄을 없애는 것입니다. 몇 가지 실제 컨테이너 (예 : Windsor)를 사용하기 시작하십시오. :) –
Buthrakaur
@Buthrakaur Spring.net이 앞으로 이것을 지원할 것입니다. 아마도 spring.net에서 표현식을 사용하여 이것을 해결할 수있는 또 다른 방법이 있습니다. – Beachwalker