2013-11-18 6 views
4

У меня есть проект с Caliburn.Micro, и я пытаюсь выполнить перенос с его SimpleContainer на Autofac.Caliburn.Micro + Autofac bootstrapping

Я использую this code, то есть обновленную версию кода в this guide. Использование SimpleContainer я просто (внутри загрузчике)

protected override void OnStartup(object sender, System.Windows.StartupEventArgs e) 
{ 
    this.DisplayRootViewFor<IScreen>(); // where ShellViewModel : Screen 
} 

Теперь это больше не работает, так что я должен сделать, чтобы интегрировать Autofac с Caliburn.Micro?

+0

Что происходит, вы получаете исключение или что? Пожалуйста, предоставьте более подробную информацию. Спасибо. –

+0

Ничего. И странная вещь, которую я заметил, это то, что она даже не запускает метод OnStartup. Теоретически DisplayRootViewFor <> должен вызывать WindowManager.ShowDialog для ShellView с ShellViewModel, но ничего не отображается. – Sergio

+0

Используете ли вы Bootstrapper из указанной вами ссылки без изменений? –

ответ

2

В вашем решении есть несколько недостатков.

Во-первых, ничто не вызывает ваш AppBootstrapper. Обычно это делается в Caliburn.Micro путем добавления вашего типа загрузочного файла в качестве ресурса в App.xaml. См. here для получения инструкций по WPF.

т.е. ваш App.xaml должен выглядеть следующим образом:

<Application x:Class="AutofacTests.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:AutofacTests"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary> 
        <local:AppBootstrapper x:Key="bootstrapper" /> 
       </ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Во-вторых, как ваши просматривать модели и представления находятся в разных сборках, как нужно будет Caliburn.Micro и Autofac знать, где они расположены (для просмотра местоположения и соответственно разрешение зависимостей).

Загрузочный автозагрузчик Autofac использует разрешения разрешений от экземпляра AssemblySource, который Caliburn.Micro использует для просмотра местоположения. Поэтому вам просто нужно заполнить эту сборку сборок. Вы можете сделать это overridding SelectAssemblies в вашем AppBootstrapper:

protected override IEnumerable<Assembly> SelectAssemblies() 
{ 
    return new[] 
       { 
        GetType().Assembly, 
        typeof(ShellViewModel).Assembly, 
        typeof(ShellView).Assembly 
       }; 
} 
+0

, как я писал, и как вы можете видеть в прилагаемом решении, я создаю новый загрузчик и запускаю его в приложении.cs, в любом случае сейчас я попробую ваши предложения – Sergio

+0

Я перепробовал метод SelectAssemblies, но ничего не изменилось, можете ли вы взглянуть на мое решение и рассказать мне о том, какие именно изменения нужны? спасибо – Sergio

+0

Это точные изменения, которые вам нужны, я сделал их самостоятельно для вашего решения. Вы сделали изменение App.xaml? Являются ли ваши SelectAssemblies в AppBootstrapper? – devdigital