Как я могу решить эту проблему с инъекцией Io C -Container - PullRequest
0 голосов
/ 17 июня 2020

Я начал с кода (не идеального, но работающего), и пока рефакторинг, кажется, загнал себя в угол и не совсем уверен, как это исправить эффективным способом: навсегда, потому что мне нужно десериализовать объекты, используя собственный класс сериализатора объекта, который занимает около 2 секунд для десериализации 80 объектов, отсюда и причина наличия Container.Get<Settings>(), обернутого вокруг Task.Run(), поскольку я не хочу блокировать поток пользовательского интерфейса - что является частью первой проблемы.

Вторая проблема заключается в том, что теперь я хотел бы переместить все логические c программы из методов Launch() и OnExit() и попытался создать класс для сделайте это для меня.

Класс, которым я закончил, это:

public class AppManager
{
    private readonly IConfiguration _configuration;
    private readonly IRetriever _retriever;
    private Settings _settings;

    public AppManager(IConfiguration configuration, IRetriever retriever)
    {
        _configuration = configuration;
        _retriever = retriever;
    }

    public async void Main()
    {
        _settings = await Task.Run(() => _configuration.Load<Settings>());
        _settings.AvailableApplications = await _retriever.GetAsync();
    }

    public void Save()
    {
        _configuration.Save(_settings);
    }
}

И хотя имеет смысл , AppManager получает оба экземпляра IConfiguration (чтобы он мог загрузить конфигурацию и снова сохранить ее), определенно также имеет смысл получить экземпляр IRetriever, и это ... создает ситуацию с курицей и яйцом. Чтобы создать экземпляр IRetriever, мне нужен экземпляр Settings, но нажатие IRetriever.Load<Settings>() обратно на Bootstrapper.Launch() и создание AppManager ctor также принимает экземпляр Settings кажется ... плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...