在不注册first-prism 4和Unity的情况下解析类型

时间:2010-10-10 09:39:29

标签: dependency-injection unity-container prism

首先,我想谈谈我对棱镜,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。有人可以向我解释它是如何运作的吗?

2 个答案:

答案 0 :(得分:1)

这几个主题应该回答你的问题:

此外,如果您渴望了解Unity如何做到这一点的更多细节,请简单下载Unity 2.0并打开随安装程序提供的源代码。

我希望这会有所帮助。

谢谢, 达米安

答案 1 :(得分:0)

您无需注册要解析的类型。您需要注册要解析的类型的依赖项。在这种情况下,Shell不需要任何依赖项,因此您可以简单地解决它。但是对于一个例子(不是真的),如果你的shell将接口IService作为参数,那么你必须在解析Shell之前注册IService。

否则您将获得依赖项解析失败异常。在Prism 4.1中,由于TryResolve,它会被静默吞噬。