mirror of
https://github.com/Caraxi/mare.client.git
synced 2025-12-12 17:07:22 +01:00
rework service disposal
This commit is contained in:
parent
ef5e77017f
commit
2ca3e639b4
24 changed files with 299 additions and 265 deletions
|
|
@ -4,11 +4,11 @@ namespace MareSynchronos.Mediator;
|
|||
|
||||
public class MareMediator : IDisposable
|
||||
{
|
||||
private record MediatorSubscriber(object Subscriber, Action<IMessage> Action);
|
||||
private record MediatorSubscriber(IMediatorSubscriber Subscriber, Action<IMessage> Action);
|
||||
|
||||
private readonly Dictionary<Type, HashSet<MediatorSubscriber>> _subscriberDict = new();
|
||||
|
||||
public void Subscribe<T>(object subscriber, Action<IMessage> action) where T : IMessage
|
||||
public void Subscribe<T>(IMediatorSubscriber subscriber, Action<IMessage> action) where T : IMessage
|
||||
{
|
||||
_subscriberDict.TryAdd(typeof(T), new HashSet<MediatorSubscriber>());
|
||||
|
||||
|
|
@ -18,7 +18,7 @@ public class MareMediator : IDisposable
|
|||
}
|
||||
}
|
||||
|
||||
public void Unsubscribe<T>(object subscriber) where T : IMessage
|
||||
public void Unsubscribe<T>(IMediatorSubscriber subscriber) where T : IMessage
|
||||
{
|
||||
if (_subscriberDict.TryGetValue(typeof(T), out var subscribers))
|
||||
{
|
||||
|
|
@ -30,7 +30,7 @@ public class MareMediator : IDisposable
|
|||
{
|
||||
if (_subscriberDict.TryGetValue(message.GetType(), out var subscribers))
|
||||
{
|
||||
foreach (var subscriber in subscribers)
|
||||
foreach (var subscriber in subscribers.ToList())
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -44,9 +44,9 @@ public class MareMediator : IDisposable
|
|||
}
|
||||
}
|
||||
|
||||
internal void UnsubscribeAll(object subscriber)
|
||||
internal void UnsubscribeAll(IMediatorSubscriber subscriber)
|
||||
{
|
||||
foreach (var kvp in _subscriberDict)
|
||||
foreach (var kvp in _subscriberDict.ToList())
|
||||
{
|
||||
kvp.Value.RemoveWhere(p => p.Subscriber == subscriber);
|
||||
}
|
||||
|
|
@ -54,6 +54,7 @@ public class MareMediator : IDisposable
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
Logger.Verbose($"Disposing {GetType()}");
|
||||
_subscriberDict.Clear();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,16 +1,39 @@
|
|||
namespace MareSynchronos.Mediator;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using MareSynchronos.Utils;
|
||||
|
||||
public abstract class MediatorSubscriberBase : IDisposable
|
||||
namespace MareSynchronos.Mediator;
|
||||
|
||||
public abstract class MediatorSubscriberBase : IMediatorSubscriber
|
||||
{
|
||||
public MareMediator Mediator { get; }
|
||||
protected MediatorSubscriberBase(MareMediator mediator)
|
||||
{
|
||||
Mediator = mediator;
|
||||
}
|
||||
|
||||
protected readonly MareMediator Mediator;
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
Logger.Verbose($"Disposing {GetType()}");
|
||||
Mediator.UnsubscribeAll(this);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber
|
||||
{
|
||||
public MareMediator Mediator { get; }
|
||||
protected WindowMediatorSubscriberBase(MareMediator mediator, string name) : base(name)
|
||||
{
|
||||
Mediator = mediator;
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
Logger.Verbose($"Disposing {GetType()}");
|
||||
Mediator.UnsubscribeAll(this);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IMediatorSubscriber : IDisposable
|
||||
{
|
||||
MareMediator Mediator { get; }
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue