2 つのインターフェイスがあります (1 つはサブスクライバー用、もう 1 つはパブリッシャー用)。
最初の 1 つは、イベントの発生を許可されているクライアントに表示される必要があります
public interface IClientLogicEvents
{
IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; }
}
2 つ目は、これらのイベントをサブスクライブして処理するクライアントに表示される必要があります。
public interface IHandleOnlyClientLogicEvents : IClientLogicEvents
{
ISubscribeEvent<CallStateChangedEventArgs> CallStateChanged { get; }
}
イベントインターフェイスは次のようになります
public interface ISubscribeEvent<out TEventArgs> where TEventArgs : EventArgs
{
void Subscribe(Action<object, TEventArgs> handler);
void Unsubscribe(Action<object, TEventArgs> handler);
}
public interface IRaiseEvent<TEventArgs> : ISubscribeEvent<TEventArgs> where TEventArgs : EventArgs
{
void Raise(object sender, TEventArgs args);
}
これらのインターフェイス (IClientLogicEvents と IHandleOnlyClientLogicEvents) の両方を実装するクラスが必要です。
このような:
public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents
また:
public sealed class ClientLogicEvents : IHandleOnlyClientLogicEvents
問題はもちろん、プロパティを 2 回 (インターフェイスごとに) 実装する必要があることです。これには、プロパティを格納するための追加のフィールドが必要です。
public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
{
/// <summary>
/// The internal call state changed event.
/// </summary>
private readonly CustomEvent<CallStateChangedEventArgs> _callStateChangedEvent;
public ClientLogicEvents()
{
_callStateChangedEvent = new CustomEvent<CallStateChangedEventArgs>();
}
/// <summary>
/// Gets the invokeable call state changed event.
/// </summary>
IRaiseEvent<CallStateChangedEventArgs> IClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }
/// <summary>
/// Gets the subscribe only call state changed event.
/// </summary>
ISubscribeEvent<CallStateChangedEventArgs> IHandleOnlyClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }
}
しかし、プロパティの実装のためにこの量のコードを節約したいと思います (200 のイベントがあるため)。これはどういうわけか可能ですか?私はちょうど何かのようなものを持っていること
public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
{
/// <summary>
/// Gets the invokeable call state changed event.
/// </summary>
public IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; private set; }
}
?