Я изучал «Внедрение зависимостей» на формах ксамарина и нашел некоторые концепции, которые используют что-то вроде ContainerBuilder
. Решения, найденные в Интернете, такие как this , рассказывают о том, как вы можете настроить DI, и внедрить их в свои модели представлений. Однако лично я не нашел ни эту, ни целую концепцию моделей представлений и связывания очень аккуратной по нескольким причинам. Я бы предпочел создавать сервисы, которые могут быть повторно использованы бизнес-логикой, которая, кажется, делает код намного чище. Я чувствовал, что реализация IServiceProvider
приведет к гораздо более чистой реализации. Я планировал внедрить поставщика услуг примерно так:
IServiceProvider Provider = new ServiceCollection()
.AddSingleton<OtherClass>()
.AddSingleton<MyClass>()
.BuildServiceProvider();
Во-первых, я не уверен, почему нет таких примеров ксамарина. Так что я не уверен, что с этим направлением что-то не так. Я посмотрел в ServiceCollection
класс. Пакет, из которого он Microsoft.Extensions.DependencyInjection
, не имеет имени aspnetcore. У этого, однако, есть его владелец как "aspnet". Я не совсем уверен, что ServiceCollection
предназначен только для веб-приложений или имеет смысл использовать его для мобильных приложений.
Безопасно ли использовать IServiceProvider
с ServiceCollection
, пока я использую все синглтоны? Есть ли какие-либо проблемы (с точки зрения производительности или оперативной памяти), я пропускаю?
Обновление
После комментариев от Nkosi я еще раз взглянул на ссылку и заметил пару вещей:
- Ссылка на документацию датирована примерно в то же время
Microsoft.Extensions.DependencyInjection
была еще в бета-версии
- Все пункты в списке под «несколькими преимуществами использования контейнера внедрения зависимостей» в документации также применимы к
DependencyInjection
, насколько я вижу.
Autofac
процесс вращается вокруг ViewModels, которые я стараюсь избегать.
Обновление 2
Мне удалось получить DI непосредственно в коде страниц с помощью функции навигации, примерно такой:
public static async Task<TPage> NavigateAsync<TPage>()
where TPage : Page
{
var scope = Provider.CreateScope();
var scopeProvider = scope.ServiceProvider;
var page = scopeProvider.GetService<TPage>();
if (navigation != null) await navigation.PushAsync(page);
return page;
}