背景として、単一の ViewModel (PCL) を共有する Windows ストア アプリと Windows Phone 8 アプリケーションをいじっています。
MVVMLight と NInject / Common Service Locator を使用して、ビュー モデルとサービスをインスタンス化しています。これは素晴らしく、テストなどに最適な本当に素晴らしい疎結合を提供してくれます。
ただし、設計時のデータ サポート (別の NInject モジュールに切り替えるなど) を取得することは完全なブラック ボックスであり、現在は機能していますが、あまり満足できず、主に試行錯誤を繰り返してきました。
ViewModelLocator
Service 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>