2011-04-29 57 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; 
    } 
}