代码之家  ›  专栏  ›  技术社区  ›  InspiredBy

Xamarin Froms.xaml.cs文件类中的构造函数注入

  •  0
  • InspiredBy  · 技术社区  · 6 年前

    我已经看到了如何在视图模型中设置依赖注入的指南,以便以后将它们用作存储库,但这对我不起作用。

    到目前为止,我试着团结一致。

    这是我想在PCL项目中使用的服务:

    public class MyService : IMyService
    {
        public void Add(string myNote)
        {
            //Add Note logic
        }
    }
    

    接口:

     public interface IMyService
     {
        void Add(string myNote);
     }
    

    App.Xaml中的Unity设置:

    public App ()
    {
       InitializeComponent();
    
        var unityContainer = new UnityContainer();
         unityContainer.RegisterType<IMyService, MyService>();
    
        var unityServiceLocator = new UnityServiceLocator(unityContainer);              
        ServiceLocator.SetLocatorProvider(() => unityServiceLocator);
    
        MainPage = new MainMasterMenu(); //<-- feel that I'm missing something here as I shouldn't be creating class instances with DI, right ?
    }
    

    我想知道的用法。这是XAML起始页后面的.CS文件:

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MainMasterMenu : MasterDetailPage
    {
        private IMyService _myService;
        public MainMasterMenu(IMyService myService)
        {
          _myService = myService
        }
    
       private void SomeFormControlClickEvent(object sender, ItemChangedEventArgs e)
        {
         _myService.Add("hi");
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Paul Kertscher    6 年前

    对于创建 MainMasterMenu 直接将不成问题,但您必须将引用传递给您的服务

    MainPage = new MainMasterMenu(unityContainer.Resolve<IMyService>());
    

    但这意味着每次 变化。你可以通过注册 主菜单

    unityContainer.RegisterType<MainMasterMenu>();
    ...
    MainPage = unityContainer.Resolve<MainMasterPage>();
    

    不管怎样,只要您想导航到另一个需要向unity注册任何依赖项的页面,就必须确保正确解析其依赖项,这需要(至少是间接的)访问unity容器。您可以传递一个包装器来封装对unity的访问

    interface IPageResolver
    {
        T ResolvePage<T>()
            where T : Page;
    }
    

    然后统一地实现这个解析器

    public class UnityPageResolver
    {
        private IUnityContainer unityContainer;
    
        public UnityPageResolver(IUnityContainer unityContainer)
        {
            this.unityContainer = unityContainer;
        }
    
        public T ResolvePage<T>()
            where T : Page // do we need this restriction here?
        {
            return unityContainer.Resolve<T>();
        }
    }
    

    unityContainer.RegisterInstance<IUnityContainer>(this);
    unityContainer.RegisterType<IPageResolver, UnityPageResolver>();
    

    但是你应该看看棱镜库( see here )解决了许多问题(例如 INavigationService 它允许您导航到其他页面,而不必关心依赖项,并且它提供了自动解析视图模型(包括依赖项)的工具。