1

运行以下代码后,在 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# 中的这种差异编译/运行时非常令人惊讶。虽然一定有充分的理由,但我忘记了发生这种情况的可能性!

4

1 回答 1

3

正如我在 FSharpX 源代码中看到的那样,Xaml 类型提供程序被删除了一个 - 您没有元数据中的 Shell 类型,所有与此类型一起使用的内容都被删除为使用基本类型的操作 - XamlFile。所以这

let a = x.Container.Resolve<Shell>()

会被抹去

let a = x.Container.Resolve<XamlFile>()

所以 Unity 只会创建新的 XamlFile 实例。相反,如果您尝试直接实例化 Shell - 那么 F# 编译器将使用提供的构造函数,所以这

let a = Shell()

实际上意味着

let a = XamlFile(XamlReader.Parse( <content-of-xaml-file> ))

在您的情况下,您可能可以实例化 Shell,然后使用 x.Container.BuildUp() 填充其内部。

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 = Shell()
     x.Container.BuildUp(a.Root) :> _

   override x.InitializeShell()= 
         base.InitializeShell();
         App.Current.MainWindow <- x.Shell :?> Window
         App.Current.MainWindow.Show()


[<STAThread>]
(new App()).Run() |> ignore
于 2012-08-19T18:05:15.600 回答