通过本机 .NET Core 依赖注入构建组合

nat*_*nho 1 c# dependency-injection composite ioc-container .net-core

如何创建像下面的示例一样的复合实现,但使用本机 .NET Core DI 容器?

\n\n
    [TestFixture]\n    public class CompositeTests\n    {\n        [Test]\n        public void BuildComposite()\n        {\n            var container = new UnityContainer();\n            container.RegisterType<IFoo, SomeFoo>("first");\n            container.RegisterType<IFoo, AnotherFoo>("second");\n            container.RegisterType<IFoo, CompositeFoo>();\n\n            var instanceOfFoo = container.Resolve<IFoo>();\n\n            Assert.IsInstanceOf<CompositeFoo>(instanceOfFoo);\n        }\n    }\n\n    public class CompositeFoo : IFoo\n    {\n        public CompositeFoo(IFoo[] others)\n        {\n            Debug.Assert(others != null);\n            Debug.Assert(others.Any());\n        }\n    }\n\n    public class AnotherFoo : IFoo {}\n    public class SomeFoo : IFoo {}\n    public interface IFoo {}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

在这种情况下,复合\xe2\x80\x9c消耗\xe2\x80\x9d子对象的数组,并且在某种意义上\xe2\x80\x9csucks在\xe2\x80\x9d中使用密钥注册的IFoo的每个实现。\这是一个重要的方面:如果您要使用键注册组合,它将尝试实例化自身,从而立即导致 StackOverflowException。

\n
\n\n

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

\n\n

这个例子是从这里提取的

\n

Ste*_*ven 5

我们的书中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>(),
        }));
Run Code Online (Sandbox Code Playgroud)

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