2016-05-26 6 views
7

私はTemplate10に基づいたアプリを持っていて、IoCを使って依存性注入を処理したいと思っています。私はこのためにUnityを使う方向に傾いています。Template10でUnity IoCコンテナを使用するにはどうすればよいですか?

  1. UI(ユニバーサルアプリ)
  2. UIロジック(ユニバーサル・ライブラリ)
  3. コアロジック(ポータブルライブラリ):私のアプリは3つのアセンブリに分かれています。

    1. は、私は全体のアプリのための単一の容器を使用するか、または各アセンブリのための1つを作成する必要があります。

  4. 私はこれらの質問がありますか?
  5. コンテナを作成してサービスを登録する場所はどこですか?
  6. さまざまなアセンブリの異なるクラスは、どのようにコンテナにアクセスする必要がありますか?シングルトンパターン?

私はDIとIoCについて多くのことを読んだことがありますが、具体的にはTemplate10のすべての理論を実際に適用する方法を知る必要があります。

登録するコード:

// where should I put this code? 
var container = new UnityContainer(); 
container.RegisterType<ISettingsService, RoamingSettingsService); 

そしてインスタンスを取得するためのコード:

var container = ??? 
var settings = container.Resolve<ISettingsService>(); 
+0

可能な重複 - 私はすべてのレイヤーを参照しなければならないのはなぜ/エントリ内のアセンブリアプリケーション?](http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-inentent-application) – NightOwl888

答えて

3

Unity Containerと私は慣れていません。

私の例ではLightInjectを使用していますが、Unityを使用して同様の概念を適用できます。 ViewModelでDIを有効にするには、ResolveForPageApp.xaml.csにオーバーライドする必要があります。

public class MainPageViewModel : ViewModelBase 
{ 
    ISettingsService _setting; 
    public MainPageViewModel(ISettingsService setting) 
    { 
     _setting = setting; 
    } 
} 


[Bindable] 
sealed partial class App : Template10.Common.BootStrapper 
{ 
    internal static ServiceContainer Container; 

    public App() 
    { 
     InitializeComponent(); 
    } 

    public override async Task OnInitializeAsync(IActivatedEventArgs args) 
    { 
     if(Container == null) 
      Container = new ServiceContainer(); 

     Container.Register<INavigable, MainPageViewModel>(typeof(MainPage).FullName); 
     Container.Register<ISettingsService, RoamingSettingsService>(); 

     // other initialization code here 

     await Task.CompletedTask; 
    } 

    public override INavigable ResolveForPage(Page page, NavigationService navigationService) 
    { 
     return Container.GetInstance<INavigable>(page.GetType().FullName); 
    } 
} 

Template10あなたはMainPage.xaml.cs{x:bind}を使用したい場合はautomaticaly、MainPageViewModelDataContextを設定します:ここに

public class MainPage : Page 
{ 
    MainPageViewModel _viewModel; 

    public MainPageViewModel ViewModel 
    { 
     get { return _viewModel??(_viewModel = (MainPageViewModel)this.DataContext); } 
    } 
} 
+0

答えをありがとう!これは私のためにうまくいった! VMをシェルビューに挿入する方法はありますか? –

+0

@NickGoloborodko私はあなたの質問についてかなり理解していない、多分あなたはこれについて新しい質問を作成する必要がありますか? –

0

は、私は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が自動的に挿入されます。

ご質問今

  1. これは、プロジェクトが相互に依存する方法によって異なります。私は何が最善の解決策であるか分かりませんが、私はUnityContainerを1つ使用してコアライブラリに配置しようと考えています。

  2. は、私は私の例では、この質問に答えを期待

  3. 私は私の例では、この質問に答えを期待

[Iocの/ DIの
関連する問題