использование форм xamarin с IServiceProvider - PullRequest
0 голосов
/ 04 июля 2018

Я изучал «Внедрение зависимостей» на формах ксамарина и нашел некоторые концепции, которые используют что-то вроде ContainerBuilder. Решения, найденные в Интернете, такие как this , рассказывают о том, как вы можете настроить DI, и внедрить их в свои модели представлений. Однако лично я не нашел ни эту, ни целую концепцию моделей представлений и связывания очень аккуратной по нескольким причинам. Я бы предпочел создавать сервисы, которые могут быть повторно использованы бизнес-логикой, которая, кажется, делает код намного чище. Я чувствовал, что реализация IServiceProvider приведет к гораздо более чистой реализации. Я планировал внедрить поставщика услуг примерно так:

IServiceProvider Provider = new ServiceCollection()
                            .AddSingleton<OtherClass>()
                            .AddSingleton<MyClass>()
                            .BuildServiceProvider();

Во-первых, я не уверен, почему нет таких примеров ксамарина. Так что я не уверен, что с этим направлением что-то не так. Я посмотрел в ServiceCollection класс. Пакет, из которого он Microsoft.Extensions.DependencyInjection, не имеет имени aspnetcore. У этого, однако, есть его владелец как "aspnet". Я не совсем уверен, что ServiceCollection предназначен только для веб-приложений или имеет смысл использовать его для мобильных приложений.

Безопасно ли использовать IServiceProvider с ServiceCollection, пока я использую все синглтоны? Есть ли какие-либо проблемы (с точки зрения производительности или оперативной памяти), я пропускаю?

Обновление

После комментариев от Nkosi я еще раз взглянул на ссылку и заметил пару вещей:

  1. Ссылка на документацию датирована примерно в то же время Microsoft.Extensions.DependencyInjection была еще в бета-версии
  2. Все пункты в списке под «несколькими преимуществами использования контейнера внедрения зависимостей» в документации также применимы к DependencyInjection, насколько я вижу.
  3. 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;
}
...