Внедрить событие как зависимость - PullRequest
5 голосов
/ 29 апреля 2011

Мне нужен мой класс для обработки System.Windows.Forms.Application.Idle - однако я хочу удалить эту конкретную зависимость, чтобы я мог выполнить ее модульное тестирование.Поэтому в идеале я хочу передать его в конструктор - что-то вроде:

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

В настоящее время я жалуюсь, что могу использовать событие только с операторами + = и - =.Есть ли способ сделать это?

Ответы [ 2 ]

9 голосов
/ 29 апреля 2011

Вы можете абстрагировать событие за интерфейсом:

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 голосов
/ 29 апреля 2011
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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...