代码之家  ›  专栏  ›  技术社区  ›  natenho

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

  •  0
  • natenho  · 技术社区  · 6 年前

    我如何创建一个类似下面的示例的复合实现,但使用本机.NET核心DI容器呢?

        [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 {}
    

    在本例中,composite使用子对象数组和 sense吸收用密钥注册的ifoo的每个实现。 这是一个重要的方面:如果要用 键,它将尝试实例化自己,从而立即 StackOverflowException。

    本地DI不支持这些命名注册。

    此示例提取自 here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Steven    6 年前

    our book , Mark 我还描述了如何为microsoft.extensions.dependencyInjection注册非通用复合数据(第15.4.4节)。

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

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