链式Unity注册方法

时间:2015-10-22 20:24:30

标签: c# dependency-injection inversion-of-control unity-container

我最近开始了一个新的职位并继承了一些代码,我试图弄清楚它是如何为了重构应用程序而工作的。我之前使用过Unity,但对它所做的一切以及它是如何做到这一点都没有很好的理解。我观看过很多教程,但没有一个能够触及看起来像这样的代码。谁能解释下面的内容呢?

unityContainer.RegisterInstance(
                    "IntegrationEntityContent", 
                    ConfigurationManager.ConnectionStrings["IntegrationEntities"].ConnectionString,
                    new ContainerControlledLifetimeManager())                
              .RegisterType<IIntegrationEntities, IntegrationEntities>(
                    new HierarchicalLifetimeManager(),
                    new InjectionConstructor());

我知道RegisterInstance提供了对象的单例实例,但似乎只分发了连接字符串的一个实例。我无法弄清楚IntegrationEntities类型如何从上面的代码中获取连接字符串,以及应用程序每次要求获取新的IntegrationEntities实例时都是如此。

1 个答案:

答案 0 :(得分:1)

unityContainer.RegisterType<IIntegrationEntities, IntegrationEntities>(
                    new HierarchicalLifetimeManager(),
                    new InjectionConstructor());

此代码使用ContainerControlledLifetimeManager对连接字符串进行命名注册,该注册表将现有对象注册为单例实例。

<Grid Grid.Column="2">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding ElementName=listBox1, Path=SelectedItem._title}"/>
    <TextBlock Grid.Row="1" Text="{Binding ElementName=listBox1, Path=SelectedItem._artist}"/>
    <TextBlock Grid.Row="2" Text="{Binding ElementName=listBox1, Path=SelectedItem._genre}"/>
    <TextBlock Grid.Row="3" Text="{Binding ElementName=listBox1, Path=SelectedItem._type}"/>
</Grid>

下一个语句将 IntegrationEntities 类注册到分层生命周期管理器。它类似于单例生命周期管理器,但会返回子容器的不同实例(如果有的话)。

  

IntegrationEntities类型如何从中获取连接字符串   上面的代码

您可以按名称解析具体注册。对于字符串类也是如此。我认为 IntegrationEntities 的构造函数具有Unity属性,其中包含&#34; IntegrationEntityContent &#34;它允许Unity容器在Resolve上注入正确的连接字符串。

  

如果应用程序正在获取新的IntegrationEntities实例   每次它要求一个

使用此配置,Unity将为每个容器返回相同的实例。如果容器已定义子容器,则它们将具有 IntegrationEntities 的自己的实例。