当前位置: 首页 > 知识库问答 >
问题:

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

段干河
2023-03-14
    [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个答案

车胤运
2023-03-14

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

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

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

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

 类似资料:
  • 如何在.NET核心库项目中将一个类注入另一个类?在API项目中的StartUp类ConfigureServices中,我应该在哪里配置DI?

  • 我需要ASP。Net核心依赖注入,将一些参数传递给实现ICardPaymentRepository接口的GlobalRepositoryClass的构造函数。 参数是用于配置的,来自配置文件和数据库,我不希望我的类去引用数据库和配置本身。 我认为工厂模式是实现这一点的最佳方式,但我想不出使用工厂类的最佳方式。工厂类本身依赖于配置和数据库。 我的创业公司目前看起来像这样: GlobalReposit

  • 我的大多数服务通常与crud方法相同

  • 这个问题有点难解释,但我会尽力的。 我有一个项目,我必须制作一个从第三方服务获取数据的UI,并进行反序列化和一些线程管理工作。 现在我的项目结构在视觉工作室的一个解决方案下: 项目A:用户界面 项目B:从第三方服务获取数据的API 项目C:线程管理器API 注:项目B有一个IB接口,C有一个IC接口来帮助依赖注入。项目B和C将在未来被其他团队使用。 项目A同时使用IB和IC接口进行依赖注入。 现在

  • 我不确定我是否完全正确地处理了这个问题。 背景:我有一个控制器动作GET foo()作为例子。这个foo()需要调用bar(),bar()可能需要很长时间。所以,我需要foo()在bar()完成之前(或无论何时)用“确定”来响应。 稍微复杂一点的是,bar()需要访问DBContext并从数据库中获取一些数据。在我当前的实现中,当我试图通过bar访问数据库时,会出现“DBContext Syste

  • 我试图在AppService的XUnit测试中实现依赖注入。理想的目标是运行原始的应用程序启动/配置,并使用启动中的任何依赖注入,而不是在我的测试中重新初始化所有的DI,这就是整个目标。 更新:莫森的答案很接近。需要更新两个语法/需求错误才能正常工作。 由于某些原因,原始应用程序可以工作,并可以调用部门应用程序服务。然而,它无法调用Xunit。最后,使用原始应用程序的启动和配置使Testserve