は、私はUnityとテンプレート10
1を使用してどのように小さな例です。 ViewModelを作成する
Iまた、人のリストを作成するDataServiceクラスも作成しました。 [Dependency]アノテーションを見てください。
public class UnityViewModel : ViewModelBase
{
public string HelloMessage { get; }
[Dependency]
public IDataService DataService { get; set; }
private IEnumerable<Person> people;
public IEnumerable<Person> People
{
get { return people; }
set { this.Set(ref people, value); }
}
public UnityViewModel()
{
HelloMessage = "Hello !";
}
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode,
IDictionary<string, object> suspensionState)
{
await Task.CompletedTask;
People = DataService.GetPeople();
}
}
2.
あなたUnityContainerを作成し、埋めるためにクラスを作成しますunityContainerにUnityViewModelとのDataServiceを追加します。 UnityViewModelを解決するためのプロパティを作成します。
public class UnitiyLocator
{
private static readonly UnityContainer unityContainer;
static UnitiyLocator()
{
unityContainer = new UnityContainer();
unityContainer.RegisterType<UnityViewModel>();
unityContainer.RegisterType<IDataService, RuntimeDataService>();
}
public UnityViewModel UnityViewModel => unityContainer.Resolve<UnityViewModel>();
}
3. UnityLocatorをアプリケーションに追加します。XAML
<common:BootStrapper x:Class="Template10UWP.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="using:Template10.Common"
xmlns:mvvmLightIoc="using:Template10UWP.Examples.MvvmLightIoc"
xmlns:unity="using:Template10UWP.Examples.Unity">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles\Custom.xaml" />
<ResourceDictionary>
<unity:UnitiyLocator x:Key="UnityLocator" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<!-- custom resources go here -->
</ResourceDictionary>
</Application.Resources>
4.ページを作成します
はDataContextのようUnityViewModelを設定し、
<Page
x:Class="Template10UWP.Examples.Unity.UnityMainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Template10UWP.Examples.Unity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
DataContext="{Binding Source={StaticResource UnityLocator}, Path=UnityViewModel}"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding HelloMessage}" HorizontalAlignment="Center"
VerticalAlignment="Center" />
<ListBox Grid.Row="1" ItemsSource="{Binding People}" DisplayMemberPath="FullName">
</ListBox>
</Grid>
コントロールにプロパティをバインドするUnityLocatorを使用して、
ページがUnityViewModelを解決すると、DataServiceが自動的に挿入されます。
ご質問今
これは、プロジェクトが相互に依存する方法によって異なります。私は何が最善の解決策であるか分かりませんが、私はUnityContainerを1つ使用してコアライブラリに配置しようと考えています。
は、私は私の例では、この質問に答えを期待
私は私の例では、この質問に答えを期待
[Iocの/ DIの
可能な重複 - 私はすべてのレイヤーを参照しなければならないのはなぜ/エントリ内のアセンブリアプリケーション?](http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-inentent-application) – NightOwl888