2011-04-29 35 views
4

我需要我的类来处理System.Windows.Forms.Application.Idle - 但是,我想要删除该特定的依赖关系,以便我可以单元测试它。所以,理想情况下,我想在通过它在构造 - 是这样的:注入事件作为依赖

var myObj = new MyClass(System.Windows.Forms.Application.Idle); 

目前,它的抱怨,我只能用+ =和使用事件 - =运营商。有没有办法做到这一点?

回答

8

你可以抽象的接口背后的事件:

public interface IIdlingSource 
{ 
    event EventHandler Idle; 
} 

public sealed class ApplicationIdlingSource : IIdlingSource 
{ 
    public event EventHandler Idle 
    { 
     add { System.Windows.Forms.Application.Idle += value; } 
     remove { System.Windows.Forms.Application.Idle -= value; } 
    } 
} 

public class MyClass 
{ 
    public MyClass(IIdlingSource idlingSource) 
    { 
     idlingSource.Idle += OnIdle; 
    } 

    private void OnIdle(object sender, EventArgs e) 
    { 
     ... 
    } 
} 

// Usage 

new MyClass(new ApplicationIdlingSource()); 
3
public class MyClass 
{ 

    public MyClass(out System.EventHandler idleTrigger) 
    { 
     idleTrigger = WhenAppIsIdle; 
    } 

    public void WhenAppIsIdle(object sender, EventArgs e) 
    { 
     // Do something 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.EventHandler idleEvent; 
     MyClass obj = new MyClass(out idleEvent); 
     System.Windows.Forms.Application.Idle += idleEvent; 
    } 
}