Запечатанный класс или ServiceLocator Catel?

237
04 ноября 2017, 12:05

Думаю кто работал с данным фреймворком не нужно объяснять что такое сервисы в Catel, и для чего они используются.

Но, после многочасовой работой с классами c++ в голову стукнула дурная мысль, отказаться от сервисов Catel, и пользоваться запечатаными, SingleInstance классами, что в свою очередь так же обеспечит доступ к ним из любой модели, вью модели. Стоит ли так делать? И что может пойти не так?

UPD.

Добавлю пример почему мне еще приходит данная мысль в голову.

Приложение само по себе SingleInstance, и при запуске нового экземпляра, передает все полученные аргументы в "обработчик", в котором есть event оповещающий о новых параметрах, или какой-то команды.

Все бы не плохо, имеется интерфейс, имеется сервис, все хорошо. Но, когда мы добавляем сервис в тот или иной класс модели/вью модели, то вот тут то и наступает небольшой конфликт. Интерфейс не может содержать делегаты, которые в свою очередь иногда нужны.

UPD.

Примеры реализаций:

Запечатаный класс

public sealed class ResolvedFromInstance
{
    public delegate void MakeResolvedData(object sender, IList<string> args);
    private static ResolvedFromInstance _instance;
    private ResolvedFromInstance()
    {
        ResolvedFromInstance.Instance.OnMakeResolvedData(new List<string>());
    }
    public static ResolvedFromInstance Instance
    {
        get { return _instance ?? (_instance = new ResolvedFromInstance()); }
    }
    public event MakeResolvedData MakedResolvedData;
    public void OnMakeResolvedData(IList<string> args)
    {
        MakedResolvedData?.Invoke(this, args);
    }
}

Сервис/класс и интерфейс

public interface IResolvedFromInstance
{
    event ResolvedFromInstance.MakeResolvedData MakedResolvedData;
    bool WriteMessageStack(IList<string> args);
    void OnMessagesWrited(IList<string> args);
}
public class ResolvedFromInstance: IResolvedFromInstance
{
    public delegate void MakeResolvedData(object sender, IList<string> args);
    public event MakeResolvedData MakedResolvedData;
    public bool WriteMessageStack(IList<string> args)
    {
        OnMessagesWrited(args);
        return true;
    }
    public virtual void OnMakeResolvedData(IList<string> args)
    {
        MakedResolvedData?.Invoke(this, args);
    }
}
READ ALSO
C# Unity3D - Чекпоинт

C# Unity3D - Чекпоинт

Как можно сделать невидимые чекпоинты, и когда персонаж проходит через них, у него появляются новые способности(Например: в коде, персонаж...

252
С# Кракозябры при заполнении массива из файла

С# Кракозябры при заполнении массива из файла

Пытаюсь загрузить файл с Ru и En именами

254
Не форматирует json

Не форматирует json

Подскажите, почему я получаю не ровный столбец в notepad, а вот такое

289