Spring.NET — Lambdas как зависимости — возможно с XML?

Я знаю, что Spring.NET поддерживает «Spring Expressions» — текст, который анализируется во время выполнения как код — и что их можно объявить в вашей конфигурации XML.

Но можете ли вы определить лямбда-выражение, проанализировать его и использовать в качестве строго типизированного делегата в вашем коде, скажем, в качестве параметра конструктора?

Что-то вроде этого:

<object name="Page1To2Transition"
    type="XmlVsDslConfig.PageTransition, XmlVsDslConfig">
  <constructor-arg type="string" value="Page1-Page2"/>
  <constructor-arg ref="Page1"/>
  <constructor-arg ref="Page2"/>
  <property name="CanTransition" expression="#CanTransition = {|p| true }"/>
</object>

где конструктор PageTransition выглядит так:

public PageTransition ( 
    String name, 
    Page from, 
    Page to, 
    Func<Page, bool> canTransition )
{/*...*/}

person Bobby    schedule 16.04.2011    source источник
comment
Я так не думаю, не пробовал, но, может быть, вы можете спросить на форумах spring.net, а позже открыть jira, предлагающую эту функцию?   -  person tobsen    schedule 12.05.2011
comment
Хорошие моменты - я не особенно большой поклонник Spring.NET, но хотел убедиться, что я даю ему справедливую оценку (хотя это была бы крутая функция) - может быть, вы познакомитесь с этим. Спасибо   -  person Bobby    schedule 12.05.2011
comment
AFAIK: Нет. См. мой связанный вопрос stackoverflow.com/questions/7039144/ о внедрении Func/Predicate.   -  person Beachwalker    schedule 28.08.2012


Ответы (1)


AFAIK невозможно напрямую использовать Spring.net Expressions. Возможно, вы сможете решить проблему передачи делегата конструктору/свойству через xml-config, используя встроенный DelegateFactoryObject Spring.net.

  <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>

Это создаст делегат типа Action. Вы также можете создавать делегаты любого другого типа (просто укажите тип в свойстве с именем «DelegateType» (включая запрошенный вами делегат Func).

Возможно, вы можете использовать его в сочетании с выражениями, чтобы получить нужный вам результат.

person Beachwalker    schedule 29.08.2012