Использование события для применения шаблона TellDontAsk

Я пытался вызвать событие в cSharp, чтобы уведомить об изменении кода в моем приложении, чтобы иметь сценарий tellDontAsk.

У меня есть простой класс, который реализует из класса событий

public class SimpleTellDontAsk : ISomeEvent
{
    public void doSomething(string text, EventHandlerArgs args)
    {
        Console.WriteLine("Email this message {0}", text);
        //sending message with email
        args.IsDo = true;
        RaiseEvent(this, args);
    }

    public event EventHandler RaiseEvent;
}

Я определяю свой класс событий, как показано ниже

public interface ISomeEvent
{
    event EventHandler RaiseEvent;
}

public class SomeEvent : ISomeEvent
{
    public event EventHandler RaiseEvent;
}

public class EventHandlerArgs : EventArgs
{
    public bool IsDo { get; set; }
}

Я пытаюсь использовать свой код с тестом Nunit

[TestFixture]
public class TestSimpleTellDontAsk
{
    [Test]
    public void Given_Text_When_doSomething_Then_ShouldPubliushArgs()
    {
        var tellDontAsk = new SimpleTellDontAsk();
        var senderEventHandlerArgs = new EventHandlerArgs();
        tellDontAsk.doSomething("test message", senderEventHandlerArgs);
        Assert.IsTrue(senderEventHandlerArgs.IsDo);
    }
}

Когда я запускаю тест, возникает нулевое исключение ссылки

System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

Я верю, что чего-то не хватает, но не могу понять, есть идеи?

2 ответа

Решение

RaiseEvent не прикреплен

 bool eventFired = false;

 var tellDontAsk = new SimpleTellDontAsk();
 tellDontAsk.RaiseEvent += (o, e) =>
            {
                if (e.IsDo)
                    eventFired = true;
            };
 tellDontAsk.doSomething("test message");
 Assert.IsTrue(eventFired);

Также, если вы хотите использовать свои собственные EventArgs "EventHandlerArgs", вы должны перейти к универсальному EventHandler.

Аргументы событий не должны указываться в параметрах метода, они должны создаваться, когда нам нужно вызвать событие.

public class SimpleTellDontAsk : ISomeEvent
{
    public void doSomething(string text)
    {
        Console.WriteLine("Email this message {0}", text);
        //sending message with email
        if (RaiseEvent != null) //Check if we have listeners
        {
            EventHandlerArgs args = new EventHandlerArgs();
            args.IsDo = true;
            RaiseEvent(this, args);
        }
    }
    public event EventHandler<EventHandlerArgs> RaiseEvent;
}

RaiseEvent не имеет подключенного обработчика, изменил код для присоединения обработчика по умолчанию, я до сих пор не понимаю, как он реализует принцип "не спрашивай", вы просто проверяете свойство IsDo, что такое ISomeEvent?

public interface ISomeEvent
{
    event Action<ISomeEvent, EventHandlerArgs> RaiseEvent;
}

public class SomeEvent : ISomeEvent
{
    public event Action<ISomeEvent, EventHandlerArgs> RaiseEvent;
}
public class EventHandlerArgs : EventArgs
{
    public bool IsDo { get; set; }
}

public class SimpleTellDontAsk : ISomeEvent
{
    public SimpleTellDontAsk()
    {
        RaiseEvent = (s,e) => { };
    }                                
    public void doSomething(string text, EventHandlerArgs args)
    {
        Console.WriteLine("Email this message {0}", text);
        //sending message with email
        args.IsDo = true;
        RaiseEvent(this, args);
    }

    public event Action<ISomeEvent, EventHandlerArgs> RaiseEvent;
}
Другие вопросы по тегам