1

我試圖在WPF MVVM應用程序中實現Unity,但我錯過了大圖。Caliburn.Micro + Unity 2.1 + MVVM:示例代碼

在這個時刻我已經創建了一個引導程序是這樣的:

public class MainBootstrapper : Bootstrapper<MainViewModel> 
    { 
    private UnityContainer container; 

    protected override void Configure() 
    { 
     container = new UnityContainer(); 
     container.RegisterType<IServiceLocator, UnityServiceLocator>(new ContainerControlledLifetimeManager()); 
     container.RegisterType<IWindowManager, WindowManager>(new ContainerControlledLifetimeManager()); 
     container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager()); 
    } 

    protected override object GetInstance(Type service, string key) 
    { 
     if (service != null) 
     { 
     return container.Resolve(service); 
     } 

     if (!string.IsNullOrWhiteSpace(key)) 
     { 
     return container.Resolve(Type.GetType(key)); 
     } 

     return null; 
    } 

    protected override IEnumerable<object> GetAllInstances(Type service) 
    { 
     return container.ResolveAll(service); 
    } 

    protected override void BuildUp(object instance) 
    { 
     container.BuildUp(instance); 
    } 
    } 

怎麼樣呢就是用最好的方法? 此代碼當前工作:

public class MainViewModel : PropertyChangedBase 
    { 
    public MainViewModel() 
    { } 

    [Dependency] 
    public Sub1ViewModel Sub1VM { get; set; } 
    [Dependency] 
    public Sub2ViewModel Sub2VM { get; set; } 
    } 

中的MainView有這樣的:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <ContentControl Grid.Row="0" Name="Sub1VM" /> 
    <ContentControl Grid.Row="1" Name="Sub2VM" /> 

</Grid> 

首先:我共享的代碼,這是使用Unity +卡利的正確方法是什麼?

現在讓我們說我的Sub1VM使用模型'M1',但是Sub2VM需要使用相同的模型來顯示信息,而不是通過創建另一個模型M1的實例。 (singleton)

這是如何工作的?顯示我在每個viewmodel構造函數中使用IServiceLocator?有人可以分享一個代碼示例來解釋它嗎?

回答

1

首先我McDonnellDean同意,你應該瞭解的屏幕,指揮及作曲的文章(如果我是你,我會讀之前所有的文章太瞭解Caliburn.Micro如何工作的。)。除此之外,您正確實施了Unity,您可以檢查Unity as IoC Container for Caliburn.Micro瞭解更多信息。另一方面,這裏混合了兩個概念,即依賴注入和MVVM。關於你關於模型的問題,我還會更喜歡構造函數注入,如果你想要一個模型的實例,也許你可以注入一個Factory爲你創建這個模型,並將它包裝到兩個不同的視圖模型中,並通過兩個不同的屬性。最後我真的鼓勵你們閱讀的教程(start here),至少是基本的話題。

+0

感謝您的「從這裏開始」鏈接 – juFo

+0

@juFo,不客氣。 –

1

我不太瞭解Unity,但您的配置看起來正確。

至於你的注射點。我會說,而不是做屬性注入,你應該做建設者注入。你在做什麼很好,但是你可能想要查看屏幕和導體,這些可以讓你爲ViewModels添加生命週期。通常,它應該是這樣的:

  • 引導程序打開ShellViewModel

  • ShellViewModel通過構造函數注入發生在MainViewModel作爲IConductorOneActive

  • MainViewModel需要IScreens的集合。

  • ShellViewModel調用MainViewModel在MainViewModel上激活方法。

請參閱Screens, Conductors and Composition。正如我上面所說的,你的方式很好,但在手動方面有一點點,意味着你必須手工連接所有東西。