5

背景として、単一の ViewModel (PCL) を共有する Windows ストア アプリと Windows Phone 8 アプリケーションをいじっています。

MVVMLight と NInject / Common Service Locator を使用して、ビュー モデルとサービスをインスタンス化しています。これは素晴らしく、テストなどに最適な本当に素晴らしい疎結合を提供してくれます。

ただし、設計時のデータ サポート (別の NInject モジュールに切り替えるなど) を取得することは完全なブラック ボックスであり、現在は機能していますが、あまり満足できず、主に試行錯誤を繰り返してきました。

ViewModelLocatorService Locator からビュー モデルをプルする (アプリ リソースとしてインスタンス化された)を持つという標準的な方法を使用しています。これは常に実行されます。

問題は、設計時のエディターによって実際に実行されているコードの量がわからないことです。したがって、NInject が初期化され、CSL が NInject にフックされるようにするには、NInject を開始するためにクラスをViewModelLocator呼び出す静的コンストラクターが必要です。App

これは私には間違っているようです。本当に、これのベストプラクティスが何であるかを知りたいのですが、設計時に表示されている間にアプリケーションのどの部分が「開始」されるかについて実際にドキュメント/保証があるかどうか、およびそれが異なる場合Windows ストア アプリと Windows Phone 8 アプリ。

ViewModelLocator.cs (スニペット)

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        System.Diagnostics.Debug.WriteLine("VML Start");
        var servicelocator = new NinjectServiceLocator(App.Kernel);
        ServiceLocator.SetLocatorProvider(() => servicelocator);
        System.Diagnostics.Debug.WriteLine("VML End");
    }

    public AppViewModel AppViewModel
    {
        get { return ServiceLocator.Current.GetInstance<AppViewModel>(); }
    }

    public MainViewModel MainViewModel
    {
        get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
    } 
}

App.xaml.cs (スニペット)

partial class App : Application
{
    public static StandardKernel Kernel { private set; get; }

    static App()
    {
        // Register dependencies & hook the service locator to use NInject under the hood
        var servicemodule = ViewModelBase.IsInDesignModeStatic ? (NinjectModule)new DesignTimeModule() : new RunTimeModule();
        var viewmodelmodule = new ViewModelModule();
        App.Kernel = new StandardKernel(servicemodule, viewmodelmodule);
    }
}

App.xaml (スニペット)

<?xml version="1.0" encoding="utf-8"?>
<Application RequestedTheme="Dark"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="KieranBenton.LeaveNow.App.App"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:app="using:KieranBenton.LeaveNow.App"
             xmlns:dependencies="using:KieranBenton.LeaveNow.App.Dependencies"
             mc:Ignorable="d">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                ...
            </ResourceDictionary.MergedDictionaries>
            <dependencies:ViewModelLocator x:Key="ViewModelLocator"
                                           d:IsDataSource="True" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

Main.xaml

<tcdcontrols:LayoutAwarePage x:Name="pageRoot"
                             x:Class="KieranBenton.LeaveNow.App.Pages.Main"
                                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                             xmlns:tcdcontrols="using:TCD.Controls"
                             xmlns:vm="using:KieranBenton.LeaveNow.ViewModel"
                             mc:Ignorable="d"
                             DataContext="{Binding MainViewModel, Source={StaticResource ViewModelLocator}}">
    <Page.Resources>
        <!-- Collection of grouped items displayed by this page, bound to a subset of the complete item list because items in groups cannot be virtualized -->
        <!-- NOTE: Ridiculous lengths to get this working - see http://www.ralbu.com/post/2012/11/18/Building-WinRT-Windows-8-Grouped-items-using-MVVMLight.aspx -->
        <CollectionViewSource x:Name="groupedItemsViewSource"
                              Source="{Binding Journeys}"
                              d:Source="{Binding Journeys, Source={d:DesignInstance Type=vm:Main, IsDesignTimeCreatable=True}}"
                              IsSourceGrouped="true"
                              ItemsPath="Routes" />
    </Page.Resources>
4

1 に答える 1