【问题标题】:Unit DI to Microsoft DI - Conditional Resolving单元 DI 到 Microsoft DI - 条件解析
【发布时间】:2020-05-17 11:15:38
【问题描述】:

我正在将我的 .Net Framework 代码转换为 .Net Core 3.1。

在我的旧代码中,我使用 Unity 处理我的 DI,现在我使用 Microsoft 的 DI 工具。

但是,我无法模仿我在 Unity 中注入特定策略模式实现的方式:

 container.RegisterType<IService, ConcreteServiceA>("MyString");

 container.RegisterType<IStrategy, Strategy>(
       new InjectionConstructor(
            new ResolvedArrayParameter<IService>(
                new ResolvedParameter<IService>("MyString")
            )
       ));

如何使用 Microsoft DI 进行等效操作?谢谢。

【问题讨论】:

  • Unity 确实有一个 extension 可以插入 Microsoft DI

标签: .net .net-core dependency-injection


【解决方案1】:

根据您要执行的操作,请注意以下事项

默认服务容器更换

内置服务容器旨在满足框架和大多数消费者应用程序的需求。我们建议使用内置容器,除非您需要内置容器不支持的特定功能,例如:

  • 属性注入
  • 基于名称的注入 (强调我的)
  • 儿童容器
  • 自定义生命周期管理
  • Func&lt;T&gt; 支持延迟初始化
  • 基于约定的注册

参考Default service container replacement

Unity 确实有一个 extension 可以插入 Microsoft DI

安装 nuget 包

Install-Package Unity.Microsoft.DependencyInjection

并使用相关的扩展。

例如

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseUnityServiceProvider()   //<---- Add this line
        .ConfigureContainer<IUnityContainer>( container => {
            container.RegisterType<IService, ConcreteServiceA>("MyString");

            container.RegisterType<IStrategy, Strategy>(
               new InjectionConstructor(
                   new ResolvedArrayParameter<IService>(
                       new ResolvedParameter<IService>("MyString")
                    )
               ));
        })
        //...

【讨论】:

  • 很高兴知道...我可能会走那条路。如果可能的话,我想使用 Microsoft DI 库,但如果我想不通,我可以进行切换。
  • @mint 默认 DI 容器的功能非常有限。正如您已经体验过尝试复制 Unity 功能一样。出于同样的原因,MS 使容器易于扩展。查看docs.microsoft.com/en-us/aspnet/core/fundamentals/…
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2015-12-20
  • 2020-06-09
  • 2017-05-14
  • 2016-05-04
  • 2018-09-14
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多