Я попытался понять создание классов ViewModels и Service и записал его для других. Пожалуйста, исправьте/добавьте, где необходимо.
Создание экземпляров ViewModels и сервисов выполняется не самым обычным способом. Это было сделано с использованием отражения.
В TipCalc у вас есть:
public class FirstViewModel : MvxViewModel
{
private readonly ICalculationService _calculationService;
public FirstViewModel(ICalculationService calculationService)
{
_calculationService = calculationService;
}
...
}
и
public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
public override void Initialize()
{
CreatableTypes()
.EndingWith("Service")
.AsInterfaces()
.RegisterAsLazySingleton();
...
}
}
Во время инициализации() Интерфейсы и классы, созданные как Служба (имя заканчивается на Службе), спариваются с использованием отражений, имен интерфейса и имен классов (IPersonService и PersonService). Это позже используется для обратного просмотра экземпляра класса (таблица поиска содержит ленивые ссылки на экземпляры одноэлементных классов обслуживания. Службы создаются, когда null.
public FirstViewModel (ICalculationService calculateService) ссылается на экземпляр CalculationService. Это делается с использованием ранее созданной таблицы поиска.
Создание объектов ViewModels выполняется через структуру Mvx. Когда MvxFramework "спросит" о создании экземпляра ViewModel, он отобразит ViewModel и определит, какие конструкторы существуют в этом классе. Если есть конструктор без параметров, то это будет использоваться. Если есть конструктор с параметром, а параметр является интерфейсом класса сервиса, тогда в качестве параметра будет использоваться экземпляр (singleton) этой службы.
Службы создаются аналогичным образом; их конструкторы отражаются и создаются параметры (singleton). И так далее.