Prism
官方文档:
Introduction to Prism | Prism (prismlibrary.com)
Prism是一个框架,用于构造松耦合可测试的XAML应用程序(如WPF)。Prism提供了一组实现的设计模式,这些设计模式有助于编写结构良好且可维护的XAML应用程序:
容器
针对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
这是目前我认为最好的免费学习资料...