如何在Template10中使用Unity IoC容器?

Chr*_*jer 8 .net c# unity-container uwp template10

我有一个基于Template10的应用程序,并希望使用IoC处理我的依赖注入.我倾向于使用Unity来实现这个目标.我的应用程序分为三个程序集:

  1. UI(通用应用)
  2. UI逻辑(通用库)
  3. 核心逻辑(便携式图书馆).

我有这些问题:

  1. 我应该为整个应用程序使用单个容器,还是为每个程序集创建一个容器?
  2. 我应该在哪里创建容器并注册我的服务?
  3. 各种程序集中的不同类应该如何访问容器?单身人士模式?

我已经阅读了很多关于DI和IoC的内容,但我需要知道如何在实践中应用所有理论,特别是在Template10中.

注册代码:

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

然后是检索实例的代码:

var container = ???
var settings = container.Resolve<ISettingsService>();
Run Code Online (Sandbox Code Playgroud)

Ask*_*uch 3

我不熟悉Unity Container

我的例子是使用LightInject,您可以应用类似的概念使用Unity。要启用 DI,ViewModel您需要在项目上覆盖ResolveForPageon 。App.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Template10如果您想使用on ,将自动设置DataContext为:MainPageViewModel{x:bind}MainPage.xaml.cs

public class MainPage : Page
{
    MainPageViewModel _viewModel;

    public MainPageViewModel ViewModel
    {
      get { return _viewModel??(_viewModel = (MainPageViewModel)this.DataContext); }
    }
}
Run Code Online (Sandbox Code Playgroud)