我想要完成的基本思想是配置我的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主题,但仍无法解决问题。我发现的所有示例都包含直接的项目引用,这正是我想要避免的。
谢谢!
答案 0 :(得分:0)
要进行程序集发现和动态XAP加载,您应该使用MEF容器,而不是Unity。
查看官方来源的更多信息:http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx