【问题标题】:asp.net core not Dependency Injecting .net framework 4.5.1 librariesasp.net 核心不是依赖注入 .net 框架 4.5.1 库
【发布时间】:2019-11-18 10:04:44
【问题描述】:

我有一个以 WCF 作为其入口点的旧应用程序,它依赖注入在 .net 框架 4.5.1 项目中创建的接口。我正在尝试用 asp.net 核心替换 wcf 层,当我尝试使用 asp.net 核心的默认 DI 进行依赖注入时,我得到了

异常是:InvalidOperationException - 当前类型,xxxx 是一个接口,不能构造。您是否缺少类型映射?

我尝试使用带有目标框架 4.6.1 的 Asp.net core 2.2 以及目标框架设置为 .net core 2.1 的 asp.net core 2.1

我在 asp.net core 中的 DI 设置如下所示

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddSingleton<ITradeBusinessService, TradeBusinessService>();
        services.AddSingleton<IUnityContainer, UnityContainer>();
        services.AddSingleton<ICommonDataRepository, CommonDataRepository>();
    }

此服务 TradeBusinessService 在构造函数中接受 IUnityContainer。

        public TradeBusinessService(IUnityContainer objectContainer)
    {
        container = objectContainer;
        commonRepository = container.Resolve<ICommonDataRepository>();

当我尝试解决 ICommonDataRepository 时,我得到了上面的错误。

ICommonDataRepository 位于针对 4.5.1 的项目中

任何想法我在这里做错了什么?

【问题讨论】:

    标签: asp.net-core dependency-injection asp.net-core-webapi asp.net-core-2.1


    【解决方案1】:

    UnityContainer 只是另一个 DI 框架,类似于 Asp.net Core 的 Dependency Injection。为什么两者都需要?无论如何,问题在于您构建了新的空统一容器并将其注入TradeBusinessService。它没有注册ICommonDataRepository 类型。我的建议是,摆脱UnityContainer,直接在TradeBusinessService 中注入ICommonDataRepository

    【讨论】:

    • 问题是遗留代码是这样的,但我会尝试遵循您的建议。将回复但
    • 我不知道你的遗留代码如何使用 Unity 以及替换它的成本是多少。第二种方法可以像在遗留代码中一样初始化 UnityContainer,并在 DI 中注入实例而不是类型。这样您的 TradeBusinessService 将收到初始化的统一容器。您只需要了解,在services 中注册某些内容不会统一注册,因为它是不同的容器。
    • 你一针见血。实际上我需要第二种方法。现有的东西是一个 WCF 服务,它的 web.config 和所有 DI 服务及其映射都在其中提到。我想使用该 web.config 初始化 UnityContainer 并将其传递给 asp.net 核心的映射。如果那不可能,我可以在 asp.net 核心中编写映射代码来初始化这个 UnityContainer。你有任何可以做到这一点的代码 sn-p 吗?
    • 我在想这样的事情 var container = new UnityContainer(); services.AddSingleton(容器);现在我需要告诉这个“容器”对象 web.config 文件在哪里选择它的映射。这些线周围的东西。
    • 没有足够的信息来说明您现在如何使用 unity。它是否在 http 管道上注册为解析器?您是否有容器的静态/单例实例并从您想要的任何地方调用 Resolve?您是否注入 IUnityContainer,然后手动解析您需要的所有类型?我相信你混合了所有这些。应该是很长的帖子来涵盖解决方案。
    猜你喜欢
    • 2018-12-14
    • 2016-11-08
    • 2018-01-03
    • 2019-02-16
    • 2017-12-09
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多