2017-01-25 9 views
2

Я разрабатываю 2 приложения. Один из них использует Prism.Autofac в WPF, а другой - с Prism.Unity в Xamarin Forms.Prism.Autofac.Forms Impelementation

Оба приложения работают, но у меня есть один PCL, где я использую предложения компилятора для использования Prism.Autofac или Prism.Unity.Forms в зависимости от случая.

Ну, я пытаюсь реализовать Autofac в обоих приложениях, но я не могу зарегистрировать типы на Xamarin.Forms.

Например, с Unity я это делаю:

Container.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>()); 

Но Autofac "RegisterInstance" метод не существует. Я пытаюсь много способов для достижения этой цели, и я обнаружил, что ContainerBuilder класс имеет этот метод, но если я делаю это:

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>()); 

Использование экземпляра ContainerBuilder, PRISM Контейнер не признает мои пользовательские классы/Услуги вроде зарегистрированный экземпляр, поэтому конструктор ViewModel не может быть создан.

Итак, мой вопрос: как я могу использовать методы RegisterInstance и RegisterType только с контейнером PRISM (без экземпляра ContainerBuilder)? и если это невозможно, и мне нужно создать экземпляр ContainerBuilder, как контейнер PRISM может «зарегистрировать» мои пользовательские типы?

Заранее спасибо

+0

[? Вы читали документы] (http://autofac.readthedocs.io/en/latest/register/ registration.html) –

+0

Да, это я прокомментировал. Класс ContainerBuilder имеет эти методы, но как я могу использовать их с контейнером, который использует PRISM? – gsaldana

+0

Вы спросили, как выполнить методы. Документы показывают примеры. Если вы видите ошибку или что-то еще не работает, это не ясно из вашего вопроса. «Объекты не распознаются» ничего не значит. Есть ли исключение? Что-то не так? Требуется дополнительная информация. –

ответ

2

Autofac для Prism форм было очень проблематично. Для регистрации типов в v6.x с Prism.Autofac.Forms вы бы код что-то вроде:

public class App : PrismApplication 
{ 
    protected override void RegisterTypes() 
    { 
     var builder = new ContainerBuilder(); 
     Container.RegisterTypeForNavigation<MainPage>() 
     builder.RegisterType<MyService>().As<IMyService>(); 
     builder.Update(Container); 
    } 
} 

, начинающееся с v7.0 это было обновлено. Обратите внимание, что в одном из приведенных ниже комментариев Autofac отказался от использования builder.Update, поскольку сообщество Autofac хочет сделать контейнер неизменным. Это делает его в целом плохим выбором для приложений Prism, которые хотят использовать модульность Prism. С Prism 7 реализация базового класса приложения Autofac была обновлена ​​с учетом этого и предоставила вам один ContainerBuilder, который используется для базовых регистраций Prism, а также для любых ваших конкретных типов как в общем коде, так и в вашем IPlatformInitializer. Имейте в виду, что Контейнер фактически не построен и не доступен, пока вы не достигнете OnInitialized. Обновленные регистрации будет выглядеть следующим образом:

public class App : PrismApplication 
{ 
    protected override void RegisterTypes() 
    { 
     Builder.RegisterTypeForNavigation<MainPage>() 
     Builder.RegisterType<MyService>().As<IMyService>(); 
    } 
} 

Вы можете прочитать об изменениях v7 здесь:

https://dansiegel.net/post/2017/08/02/breaking-changes-for-prism-autofac-users

+0

Это именно то, что мне нужно. Я не знал, как обновить контейнер, даже если он может быть обновлен. Спасибо за помощь. – gsaldana

+0

Обновление в настоящее время устарело – hugoterelle

+0

Не в версии, которая поставляется с Prism Form 6.3 –

0

Обновление является устаревшим, лучший способ для меня, чтобы создать модуль, смотрите :

Сначала создайте модуль в проекте:

public class ExampleModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterType<LoginP>().As<ILoginP>().InstancePerDependency(); 
     base.Load(builder); 
    } 
} 

В вашей презентации слоя, включают в себя модуль пример (xamarin.Android mainActivity.cs):

public class AndroidInitializer : IPlatformInitializer 
{ 
    public void RegisterTypes(IContainer container) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterModule<ExampleModule>(); 
     builder.Update(container); 
    } 
} 
+0

Это действительно не отражает надлежащий способ обработки регистраций в Prism 6 или 7. См. Обновленную информацию о том, как правильно обрабатывать регистрацию. –

+0

Этот пример представлен в призме 6:

 Смежные вопросы

  • Нет связанных вопросов^_^