Я решил проблему, используя промежуточную «фабрику», вдохновленную предложением thekip, но оставив объект, требующий предикат и функцию в конструкторе (MyClass в примере выше), нетронутым. Это решение сохраняет «проблему» обработки делегатов весной за пределами реализации MyClass (вопреки предложению thekip, но спасибо за ваш ответ).
Вот мой способ настройки такой ситуации (настройка делегатов в Spring.Net с использованием фабричного шаблона на основе объектов).
MyDelegator class пример реализации для использования предиката / 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>
И теперь вы можете использовать это в любом месте вашей конфигурации для объектов с помощью предиката / функции.
(не нужно менять класс, требующий предикат / 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 уже имеет общее решение для этого ...