运行以下代码后,在 F# WPF 模板的项目中添加了 Nuget Prism
module MainApp
open System
open System.Windows
open System.Windows.Controls
open Microsoft.Practices.Unity
open Microsoft.Practices.Prism.UnityExtensions;
open FSharpx
type Shell = XAML<"MainWindow.xaml">
type App () =
inherit Application()
override x.OnStartup e =
base.OnStartup(e);
let bt = new BootStrapper()
bt.Run()
and BootStrapper () =
inherit UnityBootstrapper()
override x.CreateShell() =
let a = x.Container.Resolve<Shell>()
let b = a.Root
b :> DependencyObject
override x.InitializeShell()=
base.InitializeShell();
App.Current.MainWindow <- x.Shell :?> Window
App.Current.MainWindow.Show()
[<STAThread>]
(new App()).Run() |> ignore
我在编译时没有收到错误,但在运行时出现异常说 a.Root 是一个 FrameworkElement,它不能转换为 Window。
调试时,我看到“a”的运行时内容与 XAML 类型提供程序的内部表示的类型相同,即 {FSharpx.TypeProviders.XamlProvider.XamlFile},如此处所示,其内部字典为空。
我不确定 TP 的内部表示是否应该浮出水面。看起来 Unity 忽略了 Type Provider 机制。我想这是因为 Unity 似乎使用反射来找出依赖关系。
有没有人在使用 TP 时遇到过类似的行为,可以提供一些启示?
PS:F# 中的这种差异编译/运行时非常令人惊讶。虽然一定有充分的理由,但我忘记了发生这种情况的可能性!