rework service disposal

This commit is contained in:
rootdarkarchon
2023-01-31 19:52:12 +01:00
parent ef5e77017f
commit 2ca3e639b4
24 changed files with 299 additions and 265 deletions

View File

@@ -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();
}
}

View File

@@ -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; }
}