【6月日新计划33】WPF入门-Prism之IContainerRegistry

290 阅读1分钟

安裝的套件如下: 图片.png

1. IContainerRegistry

當我們使用Prism ioc框架後,為了將view和viewmodel,interface和service進行註冊和綁定,都需要放入IContainerRegistry中

IContainerRegistry这个接口的作用主要是通过将一系列的类型和对应的实体注入到容器里面,从而方便我们在使用的时候通过类型查找到注入的对象实体,当然这个接口中会定义各种类型的注入方式,这里主体包括几个部分:1 Register、2 RegisterSingleton、3 RegisterScoped等


    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            //返回 其MainWindow 窗体 效果启动程序
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //註冊公共部分的view
            containerRegistry.RegisterForNavigation<AView>();
            containerRegistry.RegisterForNavigation<BView>();
            
            //註冊interface和service
            containerRegistry.RegisterSingleton<IxxxxService, xxxxxService>();
            
            //註冊view 和viewmodel
            containerRegistry.RegisterForNavigation<FirstView, FirstViewModel>();
            containerRegistry.RegisterForNavigation<SecondView, SecondViewModel>();
            containerRegistry.RegisterForNavigation<ThirdView,ThirdViewModel>();
        }
    }

2. Container

1.我們可以在任何地方拿到容器對象,就可以拿到容器裡面的東西

2.IContainerProvider这个接口和IContainerRegistry接口的作用刚好相反,主要是通过刚才具体的类型从具体的容器中找到之前注册的对象

   IContainerProvider container = ContainerLocator.Container;
   var result = await container.Resolve<IxxxxxService>().GetPara(parameter);
    /// <summary>
    /// The <see cref="ContainerLocator" /> tracks the current instance of the Container used by your Application
    /// </summary>
    [EditorBrowsable(EditorBrowsableState.Never)]
    public static class ContainerLocator
    {
        private static Lazy<IContainerExtension> _lazyContainer;

        private static IContainerExtension _current;

        /// <summary>
        /// Gets the current <see cref="IContainerExtension" />.
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        public static IContainerExtension Current =>
            _current ?? (_current = _lazyContainer?.Value);

        /// <summary>
        /// Gets the <see cref="IContainerProvider" />
        /// </summary>
        public static IContainerProvider Container =>
            Current;

        /// <summary>
        /// Sets the Container Factory to use if the Current <see cref="IContainerProvider" /> is null
        /// </summary>
        /// <param name="factory"></param>
        /// <remarks>
        /// NOTE: We want to use Lazy Initialization in case the container is first created
        /// prior to Prism initializing which could be the case with Shiny
        /// </remarks>
        public static void SetContainerExtension(Func<IContainerExtension> factory) =>
            _lazyContainer = new Lazy<IContainerExtension>(factory);

        /// <summary>
        /// Used for Testing to Reset the Current Container
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        public static void ResetContainer()
        {
            _current = null;
            _lazyContainer = null;
        }
    }