[TestFixture]
public class CompositeTests
{
[Test]
public void BuildComposite()
{
var container = new UnityContainer();
container.RegisterType<IFoo, SomeFoo>("first");
container.RegisterType<IFoo, AnotherFoo>("second");
container.RegisterType<IFoo, CompositeFoo>();
var instanceOfFoo = container.Resolve<IFoo>();
Assert.IsInstanceOf<CompositeFoo>(instanceOfFoo);
}
}
public class CompositeFoo : IFoo
{
public CompositeFoo(IFoo[] others)
{
Debug.Assert(others != null);
Debug.Assert(others.Any());
}
}
public class AnotherFoo : IFoo {}
public class SomeFoo : IFoo {}
public interface IFoo {}
复合在这种情况下“消耗”一个子对象数组,从某种意义上说,“吸入”用密钥注册的IFoo的每个实现。这是一个重要的方面:如果您要用一个键注册复合,它将尝试实例化自己,并立即导致StackOverflow异常。
本机DI不支持这些命名注册。
这个例子是从这里提取的
在我们的书中,马克和我描述了如何为微软注册非通用复合材料。扩展。依赖注射(第15.4.4节)。
services.AddTransient<SomeFoo>();
services.AddTransient<AnotherFoo>();
services.AddTransient<IFoo>(c =>
new CompositeFoo(
new IFoo[]
{
c.GetRequiredService<SomeFoo>(),
c.GetRequiredService<AnotherFoo>(),
}));
正如这个例子所示,注册相当简单,但正如我们在书中所描述的,从这里开始,注册很快就会变得非常复杂。例如,自动布线是不可能的,当你开始将它与自动注册混合,或者当你有一个通用的抽象时,事情变得更加复杂。