我有一个接口(interface):IFoo
实现该接口(interface)的两个类:FooOne
和 FooTwo
还有两个类 ClassOne
和 ClassTwo
在构造函数中接收一个 IFoo
参数。
我如何配置 unity 以便 ClassOne
接收一个 FooOne
实例并且 ClassTwo
仅使用一个容器接收一个 FooTwo
?
我不能在运行时做,所以它必须在配置文件中。
最佳答案
看看 Unity documentation .
要获得更具可读性的配置文件,您应该为 IFoo
、FooOne
、FooTwo
、ClassOne
定义类型别名和 ClassTwo
。然后你需要注册从 IFoo
到你的实现的映射。您需要为映射设置一个名称
。
对于 IFoo
的消费者,您需要注册一个 InjectionConstructor
。
你的配置看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<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="IFoo" type="UnityConfigFile.IFoo, UnityConfigFile" />
<alias alias="FooOne" type="UnityConfigFile.FooOne, UnityConfigFile" />
<alias alias="FooTwo" type="UnityConfigFile.FooTwo, UnityConfigFile" />
<alias alias="ClassOne" type="UnityConfigFile.ClassOne, UnityConfigFile" />
<alias alias="ClassTwo" type="UnityConfigFile.ClassTwo, UnityConfigFile" />
<container>
<register type="IFoo" name="1" mapTo="FooOne" />
<register type="IFoo" name="2" mapTo="FooTwo" />
<register type="ClassOne" mapTo="ClassOne">
<constructor>
<param name="foo">
<dependency type="IFoo" name="1" />
</param>
</constructor>
</register>
<register type="ClassTwo" mapTo="ClassTwo">
<constructor>
<param name="foo">
<dependency type="IFoo" name="2" />
</param>
</constructor>
</register>
</container>
</unity>
</configuration>
这是显示其工作原理的相应测试。
UnityConfigurationSection config =
(UnityConfigurationSection) ConfigurationManager.GetSection("unity");
IUnityContainer container = new UnityContainer();
container.LoadConfiguration(config);
ClassTwo two = container.Resolve<ClassTwo>();
Assert.IsInstanceOfType(two.Foo, typeof(FooTwo));
更新
在运行时你可以这样做
IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<ClassOne>(new InjectionConstructor(
new ResolvedParameter<IFoo>("One")));
container.RegisterType<ClassTwo>(new InjectionConstructor(
new ResolvedParameter<IFoo>("Two")));
关于c# - Unity - 为同一个接口(interface)注入(inject)不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130637/