添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Prism

官方文档: Introduction to Prism | Prism (prismlibrary.com)

Prism是一个框架,用于构造松耦合可测试的XAML应用程序(如WPF)。Prism提供了一组实现的设计模式,这些设计模式有助于编写结构良好且可维护的XAML应用程序:

  • MVVM
  • 依赖注入
  • 命令
  • 事件聚合器 ...

容器

针对WPF有两种容器可用:

  • Prism.DryIoc
  • Prism.Unity, 比DryIoc使用市场更大一些

IOC 的全称是Inversion of Control(控制反转),意思就是将对象的创建和管理权交给IoC Service Provider(IoC思想的具体实现).

  • 事先将类型注册到一个容器中( containerRegistry.Register<MainWindow>(); ) .
  • 有多种注册方式,可以是瞬时也对象(containerRegistry.Register<MainWindow>()),也可以是单例( containerRegistry.RegisterSingleton<MainWindow>();),还可以直接注册对象的实例( containerRegistry.RegisterInstance<MainWindow>(new Shell.MainWindow())
    )。
  • 获取时通过反射等手段,获取类型的构造函数并调用创建对象( Container.Resolve<MainWindow>(); )
  • 如果构造函数有参数,也是通过 Container.Resolve 方法创建参数对象,然后再将创建好的参数对象传递给构造函数。

通过Nuget安装Prism

  • 创建wpf应用程序
  • 工具 》Nuget 包管理器 》解决方案的 NuGet程序包, 在浏览中搜索 Prism.Unity 勾选项目安装即可。

PrismApplication

App继承自要PrismApplication,需要修改以下两个地方:

修改App.xaml

<prism:PrismApplication x:Class="Regions.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"
             xmlns:local="clr-namespace:Regions">
    <Application.Resources>
    </Application.Resources>
</prism:PrismApplication>
  • 引入prism命名空间 xmlns:prism="http://prismlibrary.com/"
  • 指定Aapp的基类 prism:PrismApplication
  • StartupUri="{xxx}" 要删除,否则会弹出两个窗口

修改App.xaml.cs

public partial class App : PrismApplication
     protected override Window CreateShell()
         return Container.Resolve<MainWindow>();
     protected override void RegisterTypes(IContainerRegistry containerRegistry)
         containerRegistry.Register<MainWindow>();
 }

PrismApplication 是一个抽像类,需要在App类中实现两个抽象函数

PrismApplication简单分析

public abstract class PrismApplication : PrismApplicationBase
        protected override IContainerExtension CreateContainerExtension()
            return new UnityContainerExtension();
        protected override void RegisterFrameworkExceptionTypes()
            ExceptionExtensions.RegisterFrameworkExceptionType(typeof(ResolutionFailedException));
    }

简单地重载了两个函数...

public abstract class PrismApplicationBase : Application{
         protected override void OnStartup(StartupEventArgs e)
             base.OnStartup(e);
             InitializeInternal();
    }

重载了 OnStartup 函数

private void InitializeInternal()
    // 配置View 和 ViewModel 的定位器
    ConfigureViewModelLocator();
    Initialize();
    // 显示窗口
    OnInitialized();
protected virtual void Initialize()
    ContainerLocator.SetContainerExtension(CreateContainerExtension);
    _containerExtension = ContainerLocator.Current;
    _moduleCatalog = CreateModuleCatalog();
    RegisterRequiredTypes(_containerExtension);
    // 这是我们实现的抽象函数
    RegisterTypes(_containerExtension);
    _containerExtension.FinalizeExtension();
    ConfigureModuleCatalog(_moduleCatalog);
    RegionAdapterMappings regionAdapterMappings = _containerExtension.Resolve<RegionAdapterMappings>();
    ConfigureRegionAdapterMappings(regionAdapterMappings);
    IRegionBehaviorFactory regionBehaviors = _containerExtension.Resolve<IRegionBehaviorFactory>();
    ConfigureDefaultRegionBehaviors(regionBehaviors);
    RegisterFrameworkExceptionTypes();
    // 我们实现的另一个抽象函数
    Window window = CreateShell();
    if (window != null)
        MvvmHelpers.AutowireViewModel(window);
        RegionManager.SetRegionManager(window, _containerExtension.Resolve<IRegionManager>());
        RegionManager.UpdateRegions();
        InitializeShell(window);
    InitializeModules();
}

说是开源,但有些代码还是看不到,所以只能猜...

Prism WPF示例

GitHub - PrismLibrary/Prism-Samples-Wpf: Samples that demonstrate how to use various Prism features with WPF

这是目前我认为最好的免费学习资料...