Использование события для применения шаблона 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;
}