C# FW:使用injectedProperties将相同的mapTo与不同的mapFrom进行未命名注册时出现意外结果
当将同一个具体类注册到不同的未命名实例时,我们看到Unity出现了意外的行为。在这种情况下,注册似乎以意外的方式相互干扰C# FW:使用injectedProperties将相同的mapTo与不同的mapFrom进行未命名注册时出现意外结果,c#,dependency-injection,unity-container,ioc-container,C#,Dependency Injection,Unity Container,Ioc Container,当将同一个具体类注册到不同的未命名实例时,我们看到Unity出现了意外的行为。在这种情况下,注册似乎以意外的方式相互干扰 我们为我们想要注入的其他应用程序提供了一个框架 不同的接口(即对一个共同概念的不同观点)与 可能是以不同方式初始化的同一类, 使用不同的注入参数和/或不同的值。 当框架通过一个接口使用该类时,它可以预期 与通过 不同的接口。因此,我们向 同一个mapTo类具有不同的初始化(以及 当我们按类型注册时,这是合乎逻辑的 不同的接口是统一的,它们不会相互干扰 其他的。这适用于命名实
- 我们为我们想要注入的其他应用程序提供了一个框架 不同的接口(即对一个共同概念的不同观点)与 可能是以不同方式初始化的同一类, 使用不同的注入参数和/或不同的值。 当框架通过一个接口使用该类时,它可以预期 与通过 不同的接口。因此,我们向 同一个mapTo类具有不同的初始化(以及 当我们按类型注册时,这是合乎逻辑的 不同的接口是统一的,它们不会相互干扰 其他的。这适用于命名实例,但不适用于未命名实例 实例李>
- 尝试这样做有三个合乎逻辑的结果 注册映射到同一类的不同接口:
- 异常:在第二次注册期间,应引发异常。只有当我们认为这是对框架的滥用时,才会出现例外情况;我们不相信这是真的
- 覆盖:覆盖可能是有意义的,但当前实现的内部表示似乎暗示,由于mapTo类型的参数增加,它不是设计用于覆盖的。在下面的示例代码中,我们注册了映射到同一类的2个不同接口,每个接口都注入了2个属性。我们可以看到container.Policys.Policys(类型为ObjectBuilder.SpecifiedProperties SelectorPolicy)属性和值的值包含4个注入属性。在覆盖的情况下,我们希望看到使用第二次注册的值初始化2个注入属性。此行为的结果如果注册映射到同一类型的多个不同类型,并将在每个类型中注入一些具有值的属性,而其中一些属性没有(预期未初始化),则解析实例将不会对任何已注册类型进行正确初始化
- 独立注册:所有注册都将正确解决,每个注册都将注入正确的属性值
using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
namespace TestUnity
{
public interface IBaseInterface
{
string BaseString { set; get; }
}
public interface IChildInterface : IBaseInterface
{
string ChildString { set; get; }
}
public class ChildClass : IChildInterface
{
public string BaseString { set; get; }
public string ChildString { set; get; }
}
public class ContainerClass
{
public IBaseInterface impl { set; get; }
}
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.LoadConfiguration();
// the expected result BaseString ="IBaseInterface_BaseString" & ChildString ="IBaseInterface_ChildString"
// the result is BaseString ="IChildInterface_BaseString" & ChildString ="IChildInterface_ChildString"
var iBaseInterface = container.Resolve<IBaseInterface>();
// the expected result BaseString ="IChildInterface_BaseString" & ChildString ="IChildInterface_ChildString"
var iChildInterface = container.Resolve<IChildInterface>();
//We expect test class will be initialize with BaseString ="IBaseInterface_BaseString" & ChildString ="IBaseInterface_ChildString"
//but the result is the expected result BaseString ="IChildInterface_BaseString" & ChildString ="IChildInterface_ChildString"
var testClass = container.Resolve<ContainerClass>("Test");
//The container.Registrations include both regestered types(IBaseInterface & IChildInterface)
foreach (var registration in container.Registrations)
{
Console.WriteLine(@"RegisteredType :{0} ,MappedToType :{1}", registration.RegisteredType, registration.MappedToType);
}
Console.ReadLine();
}
}
}
使用系统;
使用Microsoft.Practices.Unity;
使用Microsoft.Practices.Unity.Configuration;
命名空间TestUnity
{
公共接口IBaseInterface
{
字符串BaseString{set;get;}
}
公共接口IchilInterface:IBaseInterface
{
string ChildString{set;get;}
}
公共类子类:IchilInterface
{
公共字符串基串{set;get;}
公共字符串ChildString{set;get;}
}
公共类集装箱类
{
公共IBaseInterface impl{set;get;}
}
班级计划
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.LoadConfiguration();
//预期结果BaseString=“IBaseInterface\u BaseString”&ChildString=“IBaseInterface\u ChildString”
//结果是BaseString=“IchilInterface\u BaseString”&ChildString=“IchilInterface\u ChildString”
var iBaseInterface=container.Resolve();
//预期结果BaseString=“IChildInterface\u BaseString”&ChildString=“IChildInterface\u ChildString”
var ichilInterface=container.Resolve();
//我们希望测试类将使用BaseString=“IBaseInterface\u BaseString”和ChildString=“IBaseInterface\u ChildString”进行初始化
//但结果是预期的结果BaseString=“IChildInterface\u BaseString”&ChildString=“IChildInterface\u ChildString”
var testClass=container.Resolve(“测试”);
//容器。注册包括两种注册类型(IBaseInterface和iChilInterface)
foreach(容器中的var注册。注册)
{
WriteLine(@“RegisteredType:{0},MappedToType:{1}”,registration.RegisteredType,registration.MappedToType);
}
Console.ReadLine();
}
}
}
App.config
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IBaseInterface" type="TestUnity.IBaseInterface, TestUnity" />
<alias alias="IChildInterface" type="TestUnity.IChildInterface, TestUnity" />
<alias alias="transient" type="Microsoft.Practices.Unity.TransientLifetimeManager, Microsoft.Practices.Unity"/>
<container>
<register type="IBaseInterface" mapTo="TestUnity.ChildClass, TestUnity">
<lifetime type="transient"/>
<property name="BaseString" value="IBaseInterface_BaseString" />
<property name="ChildString" value="IBaseInterface_ChildString" />
</register>
<register type="IChildInterface" mapTo="TestUnity.ChildClass, TestUnity">
<lifetime type="transient" />
<property name="BaseString" value="IChildInterface_BaseString" />
<property name="ChildString" value="IChildInterface_ChildString" />
</register>
<register name="Test" type="TestUnity.ContainerClass, TestUnity" mapTo="TestUnity.ContainerClass, TestUnity">
<lifetime type="transient" />
<property name="impl" dependencyType="IBaseInterface" />
</register>
</container>
</unity>
</configuration>
TL;博士-抱歉,但这似乎是对团结的限制
我不是构建Unity的团队的成员,因此我只能推测预期的行为,因为在这个特定场景中没有明确的文档记录。但是按照Unity的其他行为的优先顺序,我希望它会覆盖以前注册的
InjectionProperty
你是对的,o