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

使用Unity代替ASP.NET Core DI服务收集

安浩瀚
2023-03-14

越来越多的。NET核心库绑定到IServiceCollection。例如,我想使用在我的NET Framework4.7.1中描述的HttpClientFactory。桌面应用程序。我的应用程序正在使用Unity IOC。我将microsoft.extensions.http引用为nuGet。

但存在一个问题:新的ASP.NET核心组件绑定到Microsoft DI framework for.netcore-IServiceCollection。在示例中,HttpClientFactory的注册如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
}

我正在更深入地研究MS代码,并想手动地向Unity注册相应的接口和类。这是IServiceCollection注册服务的方式:

services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
services.TryAddSingleton<IHttpClientFactory, DefaultHttpClientFactory>();

将其移到Unity IoC没有问题,但当我想注册具有内部可见性的DefaultHttpMessageHandlerBuilderDefaultHttpClientFactory时,我就会感到很尴尬。因此它们不能在MS Code之外注册。

我有机会如何解决这种情况吗?

共有2个答案

欧阳君浩
2023-03-14

您有两个选项:

>

  • 创建ServiceCollection,添加工厂,然后调用BuildServiceProvider并解析IHttpClientFactory。这里有一个uber示例https://github.com/aspnet/httpclientfactory/blob/64ed5889635b07b61923ed5fd9c8b69c997deac0/samples/httpclientfactorysample/program.cs#l21。

    将unity适配器用于IServiceCollectionhttps://www.nuget.org/packages/unity.microsoft.dependencyinjection/。

  • 梁修贤
    2023-03-14

    基于@DavidFowl答案,我使用了他的第二个解决方案并完成了代码:

    这些包需要从我的项目中引用(代码片段来自。csproj):

     <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Http">
          <Version>2.1.1</Version>
        </PackageReference>
        <PackageReference Include="Unity.Microsoft.DependencyInjection">
          <Version>2.0.10</Version>
        </PackageReference>
      </ItemGroup>
    

    下面是从Unity容器解析来自ServiceCollection的服务的测试:

    using System;
    using System.Linq;
    using System.Net.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Unity;
    using Unity.Microsoft.DependencyInjection;
    using Xunit;
    
    namespace FunctionalTests
    {
        public class UnityWithHttpClientFactoryTest
        {
    
            /// <summary>
            /// Integration of Unity container with MS ServiceCollection test
            /// </summary>
            [Fact]
            public void HttpClientCanBeCreatedByUnity()
            {
                UnityContainer unityContainer = new UnityContainer();
    
                ServiceCollection serviceCollection = new ServiceCollection();
                serviceCollection.AddHttpClient("Google", (c) =>
                {
                    c.BaseAddress = new Uri("https://google.com/");
                });
                serviceCollection.BuildServiceProvider(unityContainer);
    
                Assert.True(unityContainer.IsRegistered<IHttpClientFactory>());
                IHttpClientFactory clientFactory = unityContainer.Resolve<IHttpClientFactory>();
                HttpClient httpClient = clientFactory.CreateClient("Google");
    
                Assert.NotNull(httpClient);
                Assert.Equal("https://google.com/", httpClient.BaseAddress.ToString());
    
            }
    
        }
    }
    
     类似资料:
    • 来自环境端点的默认JSON格式对于Spring应用程序的消费是完美的,因为它直接映射到Environment抽象。如果您喜欢,可以通过向资源路径(“.yml”,“.yaml”或“.properties”)添加后缀来使用与YAML或Java属性相同的数据。这对于不关心JSON端点的结构的应用程序或其提供的额外的元数据的应用程序来说可能是有用的,例如,不使用Spring的应用程序可能会受益于此方法的简

    • 本文向大家介绍使用git代替FTP部署代码到服务器的例子,包括了使用git代替FTP部署代码到服务器的例子的使用技巧和注意事项,需要的朋友参考一下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和scp的时候为了方便我们通过还要tar或者zip一下, 这些做法也很不错,但是它有一些问题 1.全部更新,不管某些文件是否修改,都要重新传一下服务器,浪费时间与流量 2

    • 我们继续看到Azure服务总线的不稳定性,并正在寻找替代方案。理想情况下,我们希望能够在Windows 2012 R2域中本地运行,并拥有许多与Azure SB相同的功能集。我们已经查看了Windows 1.1的服务总线,但是该产品已经有一段时间没有更新了,我们也不确定它的未来。我们使用C#,因此理想情况下会有一个客户端API/包装器,使与现有应用程序的集成相对容易。完全可以接受开源和自由软件。:

    • https://kubernetes.io/docs/concepts/services-networking/Ingress/中的入口示例显示,为了指定bancked入口,我们必须指定servicePort和serviceName,例如: 我希望创建具有随机端口的服务,并避免在入口定义中指定它们。有没有ServicePort的替代方案?也许使用服务中分配的端口名称或targetPort?

    • 我正在使用Java nio的WatchService,但我发现它在以下用例中非常不可靠: > 当一个很大的文件( 但是,当数千个小型(约2Kb)文件被复制到监视目录时,其中80%不会调用ENTRY_CREATE或ENTRY_MODIFY! 还有其他人面对过吗?还有更好更可靠的lib吗?或者我应该简单地切换到阻塞队列实现,文件复制器将文件名添加到队列中,消费者线程处理文件? WatchService

    • 我正在使用收集器跟踪java服务中的跨度,这一服务是http和grpc。收集器终结点是localhost:55680。此java服务跟踪成功。 现在,我想使用这个收集器基于gRPC跟踪我的go服务。 在我的go服务中,我复制以下文件:interceptor。去grpctrace。从repo opentelemetry转到contrib,这里https://github.com/open-telem

    • 要求:一个activemq队列应该在一台机器(比如machine1)中运行。该队列应该从machine1和另一台机器(比如machine2)中访问。监听器将只在machine1中运行。因此,我发送到machine1和machine2的所有消息都应该进入machine1中可用的队列,并且应该被同一台机器(machine1)中可用的监听器接收。 问题:我发送到machine1和machine2的所有消

    • 问题内容: 现在,我有一个PHP文件,该文件执行MYSQL查询,然后计算像这样的行: 这可以正常工作,但是我试图将所有PHP文件更改为使用PDO。那么如何用PDO做到这一点呢? 问题答案: 要么 您也可以使用它来询问数据是否存在或被选择: 或使用您的变量: