Я начал с кода (не идеального, но работающего), и пока рефакторинг, кажется, загнал себя в угол и не совсем уверен, как это исправить эффективным способом: навсегда, потому что мне нужно десериализовать объекты, используя собственный класс сериализатора объекта, который занимает около 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
кажется ... плохо.