3

spring を使用して、xml 構成に predicate および func オブジェクトを含むコンストラクターでオブジェクトを作成したいと考えています。Predicate および Func 引数は、別の構成済みオブジェクトのメソッドを指している必要があります。これは Spring.net を使用してどのように可能ですか? ドキュメントで解決策やヒントを見つけることができませんでした...

サンプル コンストラクターは次のようになります。

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

3 に答える 3

3

Spring.net 内で DelegateFactoryObject を使用してデリゲートを作成することもできます (Action、Func、Predicate は特別なデリゲートのみです)。

  <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 などのコンストラクトを作成して、ファクトリ メソッドを介してデリゲートを転送する必要はもうありません。

于 2012-08-28T17:06:51.963 に答える
2

述語と関数を抽出し、それらをインターフェイスの背後に配置する必要があると思います。次に、コンストラクターでこのインターフェイスを使用できます。ほとんどの場合、コンストラクター注入を使用する場合は、依存関係をインターフェイスまたは型として指定します。この例のコンストラクターは、2 つのインスタンス変数を使用します (この場合はメソッドを指しています)。

次のようなインターフェイスを作成できます。

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

そして、このインターフェースをコンストラクターパラメーターとして使用します。これにより、「他の構成済みオブジェクト」にこのインターフェースを実装させることができるのとまったく同じ結果が得られます。

于 2011-08-13T06:38:04.957 に答える
0

thekip の提案に触発された中間の「ファクトリ」を使用して問題を解決しましたが、コンストラクターで述語と関数を必要とするオブジェクト (上記の例の MyClass) はそのままにしておきます。このソリューションは、春にデリゲートを処理するという「問題」を MyClass の実装の外側に保持します (thekip の提案とは反対ですが、回答に感謝します)。

このような状況を構成する私の方法は次のとおりです (Spring.Net でデリゲートを設定し、オブジェクト ベースのファクトリ パターンを使用します)。

MyDelegator クラスは、使用する predicate/func のサンプル実装です (ここでは object ですが、predicate/func パラメーターに適合するものであれば何でもかまいません)。

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>

これで、predicate/func を持つオブジェクトの config のどこでも使用できます (predicate/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>

それでおしまい。このソリューションを改善するための提案はありますか? 多分、Spring.net はすでにこれに対する一般的な解決策を持っています...

于 2011-08-15T10:02:12.560 に答える