使用Prism和Unity在Silverlight中动态加载模块

时间:2012-01-06 11:02:32

标签: silverlight prism

我想要完成的基本思想是配置我的Silverlight应用程序以在运行时解析其依赖项(无需在项目中添加对依赖DLL的引用)。

我的UI项目引用了一个基础架构项目,而不是包含各种接口(例如存储库)。这些接口的具体实现存储在我想要下载并在运行时链接到的单独SL应用程序中。我希望能够从外部配置文件配置我的UI应用程序,以便我可以在运行时从一个接口实现切换到另一个接口实现,而无需重新编译应用程序。

到目前为止,我所做的是为每个实现创建一个Prism模块(在一个单独的SL应用程序中),并在我的Web项目中托管这些XAP。在我的UI应用程序中,我创建了一个具有以下功能的boostraper:

protected override IModuleCatalog CreateModuleCatalog()
    {
        var mc = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("/UI;component/Repositories/ModulesCatalog.xaml", UriKind.Relative));
        return mc;
    }

ModulesCatalog.xaml如下所示:

<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:sys="clr-namespace:System;assembly=mscorlib"
                      xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">

    <Modularity:ModuleInfo Ref="ImplementationOne.xap"
                       ModuleName="ImplementationOne"
                       ModuleType="ImplementationOne.Module, ImplementationOne, Version=1.0.0.0" />

</Modularity:ModuleCatalog>

在我的ConfigureContainer覆盖中,我有:

protected override void ConfigureContainer()
    {
        var unity = Unity.CreateFromXaml(new Uri("/UI;component/Repositories/UnityConfiguration.xaml", UriKind.Relative));
        unity.Containers.Default.Configure(Container);
        Container.RegisterInstance<Unity>(Unity.ConfigurationKey, unity);

        base.ConfigureContainer();
    }

unity.Containers.Default.Configure(Container)抛出无法找到程序集。 (如果我手动将DLL添加到UI.xap文件中,这样可以正常运行,因为XAP要么没有被下载,要么程序集没有被注册,我猜错了。

我一直在努力解决这个问题一周,阅读了很多SO主题,但仍无法解决问题。我发现的所有示例都包含直接的项目引用,这正是我想要避免的。

谢谢!

1 个答案:

答案 0 :(得分:0)

要进行程序集发现和动态XAP加载,您应该使用MEF容器,而不是Unity。

查看官方来源的更多信息:http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx