Unity,Prism,FSharp

时间:2013-03-15 21:13:48

标签: f# prism unity-container

当我尝试注入FSharp库时出现了解决错误,但是我没有使用CSharp库。

我有3个项目:

  • csharp的主要应用
  • 一个CSharp项目,其中包含一个类,其构造函数需要一个实例化得很好的IUnityContainer
  • 一个FSharp项目,其中包含一个类,其构造函数需要一个无法实例化错误的IUnityContainer
  

依赖项的解析失败,type =   “ModuleDBGraphFS.ModuleEntityGraphFS”,name =“(none)”。例外   发生在:同时解决。例外情况是:   InvalidOperationException - 当前类型,   Microsoft.Practices.Unity.IUnityContainer,是一个接口,不能   被建造。你错过了类型映射吗?

     

在例外时,容器是:

     

解析ModuleDBGraphFS.ModuleEntityGraphFS,(无)解析   参数“容器”的构造函数   ModuleDBGraphFS.ModuleEntityGraphFS(Microsoft.Practices.Unity.IUnityContainer   container,Microsoft.Practices.Prism.Regions.IRegionManager manager)       解析Microsoft.Practices.Unity.IUnityContainer,(无)

第一个项目中的应用程序类(WPF项目,你添加prism,从app.xaml中删除startupuri,添加后面的bootstrapper代码)

namespace WpfApplication
{
    class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return this.Container.Resolve<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();

            App.Current.MainWindow = (Window)this.Shell;
            App.Current.MainWindow.Show();
        }

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
// OK       moduleCatalog.AddModule(typeof(ModuleDBGraph.ModuleEntityGraph));
// KO       moduleCatalog.AddModule(typeof(ModuleDBGraphFS.ModuleEntityGraphFS)); 
        }
    }
}

在C#项目中

public class ModuleEntityGraph : IModule
{
    private IUnityContainer _container;
    private readonly IRegionManager _manager;

    public ModuleEntityGraph(IUnityContainer container, IRegionManager manager)
    {
        _container = container;
        _manager = manager;
    }

    void IModule.Initialize()
    {
    }
}

在F#项目中

type ModuleEntityGraphFS(container:IUnityContainer, manager:IRegionManager) =
    do printfn "hi"
    interface Microsoft.Practices.Prism.Modularity.IModule with 
        member x.Initialize() = 
            do ()

1 个答案:

答案 0 :(得分:0)

出于某种原因,prism的 Nuget 脚本在我的模块项目中添加了参考

C:\windows\assembly\GAC_MSIL\Microsoft.Practices.Unity\1.2.0.0__31bf3856ad364e35\Microsoft.Practices.Unity.dll

虽然shell项目本身正在引用

WpfApplication3\packages\Unity.2.1.505.2\lib\NET35\Microsoft.Practices.Unity.dll

我开始的一个新解决方案让我看到了问题。 因此奇怪的消息是它无法解析UnityContainer本身(应该通过Prism Unity扩展在某处注册....)