提问者:小点点

通过本机.NET核心依赖项注入构建复合


    [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不支持这些命名注册。

这个例子是从这里提取的


共1个答案

匿名用户

在我们的书中,马克和我描述了如何为微软注册非通用复合材料。扩展。依赖注射(第15.4.4节)。

services.AddTransient<SomeFoo>();
services.AddTransient<AnotherFoo>();

services.AddTransient<IFoo>(c =>
    new CompositeFoo(
        new IFoo[]
        {
            c.GetRequiredService<SomeFoo>(),
            c.GetRequiredService<AnotherFoo>(),
        }));

正如这个例子所示,注册相当简单,但正如我们在书中所描述的,从这里开始,注册很快就会变得非常复杂。例如,自动布线是不可能的,当你开始将它与自动注册混合,或者当你有一个通用的抽象时,事情变得更加复杂。