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

使用棱镜和Unity在Silverlight中动态加载模块,silverlight,prism,Silverlight,Prism,我试图实现的基本思想是配置我的Silverlight应用程序在运行时解析其依赖关系,而不必在项目中添加对依赖DLL的引用 我有一个UI项目,它引用了一个基础设施项目,而不是包含各种接口,例如存储库。这些接口的具体实现存储在单独的SL应用程序中,我想在运行时下载并链接到这些应用程序。我希望能够从外部配置文件配置我的UI应用程序,这样我就可以在运行时从一个接口实现切换到另一个接口实现,而无需重新编译应用程序 到目前为止,我所做的是在一个单独的SL应用程序中为每个实现创建一个Prism模块,并将这些X

我试图实现的基本思想是配置我的Silverlight应用程序在运行时解析其依赖关系,而不必在项目中添加对依赖DLL的引用

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

到目前为止,我所做的是在一个单独的SL应用程序中为每个实现创建一个Prism模块,并将这些XAP托管在我的web项目中。在我的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;
    }
moduleCatalog.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>
但是unity.Containers.Default.ConfigureContainer抛出找不到程序集。如果我手动将DLL添加到UI.xap文件中,这会起作用,因此我想我缺少了一些东西,因为xap没有下载,或者程序集没有注册

我已经为此挣扎了一个星期,读了很多这样的话题,但仍然无法解决问题。我发现的所有例子都包含直接的项目引用,这正是我试图避免的


谢谢

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

请参阅官方来源的更多信息:

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();
    }