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 {}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n在这种情况下,复合\xe2\x80\x9c消耗\xe2\x80\x9d子对象的数组,并且在某种意义上\xe2\x80\x9csucks在\xe2\x80\x9d中使用密钥注册的IFoo的每个实现。\这是一个重要的方面:如果您要使用键注册组合,它将尝试实例化自身,从而立即导致 StackOverflowException。
\n
本机 DI 不支持这些命名注册。
\n\n这个例子是从这里提取的
\n在我们的书中,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)
正如这个例子所示,注册相当简单,但正如我们在书中所描述的,从这里开始它很快就会变得非常复杂。例如,自动接线不适用,当您开始将其与自动注册混合或当您有通用抽象时,事情会变得更加复杂。
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |