事件注入是.net版本的spring特有的,其实现方式是反向的,同时支持静态事件和实例事件
<object id="source" type="Spring.Objects.TestObject, Spring.Core.Tests"/> <object id="staticEventListener" type="Spring.Objects.TestEventHandler, Spring.Core.Tests"> <!-- wired up to a static event --> <listener event="StaticClick" method="HandleEvent"> <ref type="Spring.Objects.TestObject, Spring.Core.Tests"/> </listener> </object> <object id="instanceEventListener" type="Spring.Objects.TestEventHandler, Spring.Core.Tests"> <!-- wired up to an event exposed on an instance --> <listener event="Click" method="HandleEvent"> <ref object="source"/> </listener> </object>
internal class TestEventHandler { public virtual void HandleEvent (object sender, EventArgs e) { _eventWasHandled = true; } public virtual bool EventWasHandled { get { return _eventWasHandled; } } protected bool _eventWasHandled; }
public event EventHandler Click; public static event EventHandler StaticClick; /// <summary> /// Public method to programmatically raise the <event>Click</event> event /// while testing. /// </summary> public void OnClick() { if (Click != null) { Click(this, EventArgs.Empty); } } /// <summary> /// Public method to programmatically raise the <b>static</b> /// <event>Click</event> event while testing. /// </summary> public static void OnStaticClick() { if (TestObject.StaticClick != null) { TestObject.StaticClick(typeof (TestObject), EventArgs.Empty); } }
Server测试
[Test] public virtual void InstanceEventWiring() { DefaultListableObjectFactory factory = new DefaultListableObjectFactory(); XmlObjectDefinitionReader reader = new XmlObjectDefinitionReader(factory); reader.LoadObjectDefinitions(new ReadOnlyXmlTestResource("event-wiring.xml", GetType())); ITestObject source = factory["source"] as ITestObject; TestEventHandler instanceHandler = factory["instanceEventListener"] as TestEventHandler; // raise the event... handlers should be notified at this point (obviously) source.OnClick(); Assert.IsTrue(instanceHandler.EventWasHandled, "The instance handler did not get notified when the instance event was raised (and was probably not wired up in the first place)."); }