C# Какие существуют альтернативные способы распространения события по цепочке вызовов?
Представь это Main.c
звонки sub.cs
какие звонки action.cs
, action.cs
поднимает и событие, которое sub.cs
подписывается, однако, на sub.cs
не волнует событие это только main.cs
что хочет знать об этом так sub.cs
поднимает событие снова, чтобы main.cs
можете подписаться на него и обнаружить, что action.cs
поднял оригинальное событие; который кажется таким громоздким.
Какие существуют альтернативы для передачи событий через цепочку вызовов методов?
3 ответа
Вы можете использовать обратный вызов вместо событий.
Вы можете добавить функцию обратного вызова в качестве дополнительного параметра к методам цепочки методов.
Например, если метод doSomething()
заменить его на doSomething(Action action)
и Main.c вызывает этот метод с Sub.doSomething(() => ReactToTheEvent());
и Action.cs звонки action();
вставка события.
Вы можете напрямую прикрепить событие, выставленное в Sub
на мероприятии, выставленном в Action
Конечно, событие должно быть выставлено как в Sub
И в Action
:
class SubClass
{
public event EventHandler MyEvent
{
add
{
_action.MyEvent += value;
}
remove
{
_action.MyEvent -= value;
}
}
private ActionClass _action;
}
С этим решением вам все равно придется объявлять событие дважды, но вы не цепляете вызовы методов и можете опустить обработчик событий в SubClass
,
Конечно, есть альтернативы, но вам может понадобиться изменить свой дизайн, и у меня недостаточно контекста, чтобы что-то предложить. В общем, я бы начал с самого простого решения. Если вам нужно просто передать одно событие, этого может быть достаточно, но если вам нужно раскрыть многие из них, то вы можете рассмотреть возможность введения третьего объекта, который показывает то, что вам нужно, и сделать доступным через SubClass
от ActionClass
Примерно так (но, пожалуйста, с лучшими именами):
public sealed class Notifications
{
public event EventHandler MyEvent;
internal void RaiseMyEvent(EventArgs e)
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, e);
}
}
class MyAction
{
public Notifications Notifications
{
get { return _notifications; }
}
// ...
}
class SubClass
{
public Notifications Notifications
{
get { return _action.Notifications; }
}
// ...
}
Обратите внимание, что этот пример является просто доказательством концепции.
Вы можете использовать pub-sub с темами, например, см. https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html
(Вам не нужен rabbitmq, для этого вы можете самостоятельно реализовать простой pub-sub или взять его из github/MSDN, см. https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx, https://github.com/upta/pubsub/blob/master/README.md)