首先,我想谈谈我对棱镜,DI和容器概念的新认识。我正在查看Prism库提供的代码示例之一: 代码只是将一个带有“Hello World”字符串的视图(在TextBlock元素中)注入shell中的一个区域。
当应用程序启动时,它会创建一个新的BootStrapper实例,用于创建和初始化shell:
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.RootVisual = (UIElement)this.Shell;
}
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
}
}
我的问题是指方法CreateShell()。我无法在提供的代码中找到任何地方(包括不在配置文件或任何xaml文件中......)他们在哪里注册Shell类型,即使它已经注册 - 供应Shell类也没有实现任何接口...什么是解决特定类型的意思? Shell实现:
public partial class Shell : UserControl
{
public Shell()
{
InitializeComponent();
}
}
这对我来说看起来很神奇,所以我尝试创建自己的类型(MyType)并以同样的方式解决它:
Container.Resolve<MyType>();
通过在MyType构造函数中设置breakepoint,我看到它已解决了MyType。有人可以向我解释它是如何运作的吗?
答案 0 :(得分:1)
这几个主题应该回答你的问题:
此外,如果您渴望了解Unity如何做到这一点的更多细节,请简单下载Unity 2.0并打开随安装程序提供的源代码。
我希望这会有所帮助。
谢谢, 达米安
答案 1 :(得分:0)
您无需注册要解析的类型。您需要注册要解析的类型的依赖项。在这种情况下,Shell不需要任何依赖项,因此您可以简单地解决它。但是对于一个例子(不是真的),如果你的shell将接口IService作为参数,那么你必须在解析Shell之前注册IService。
否则您将获得依赖项解析失败异常。在Prism 4.1中,由于TryResolve,它会被静默吞噬。