将 IServiceCollection 扩展与 DryIoc 一起使用
Use IServiceCollection extensions with DryIoc
IServiceCollection
有很多扩展 - 在我的例子中,我使用 AddHttpClient
。
我的方案是在 Startup.cs
中的 ConfigureServices
方法中注册一般内容,其中 IServiceCollection
用于注册服务。仅在特定项目中需要的所有内容都在相应项目的扩展方法中注册,但由于 DryIoc 容器必须集成到 ASP .NET Core 项目中,因此使用了 DryIoc IContainer
.
现在我有了一个只在特定项目中需要的HttpClient。因此,我想将它的注册放在各自的项目中。问题是我想为其使用 AddHttpClient,我通常只能与 IServiceCollection 一起使用。
我的问题:有没有办法在我的其他项目中使用它。也许通过从 DryIoc 容器或其他东西获取它。
这是所描述文件的一般结构:
Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.RegisterSomeService();
// register other stuff
}
}
Program.cs
public class Startup
{
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseServiceProviderFactory(new DryIocServiceProviderFactory())
.ConfigureContainer<Container>(SomeProject.ContainerSetup.Initialize);
}
ContainerSetup.cs 在 SomeProject
public static class ContainerSetup
{
public static void Initialize(HostBuilderContext hostContext, IContainer container)
{
container.Register<SomeService>();
// register other stuff
// here I want to use AddHttpClient
}
}
我建议查看 AddHttpClient https://source.dot.net/#Microsoft.Extensions.Http/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs,72bc67c4aadb77fc
并可能使用 IContainer
而不是服务集合进行相同的注册。
更新:
另一个想法是将IServiceCollection
注册到自身(或者它可能已经自动注册了?),然后从IContainer和AddHttpClient解析它..
我能够使用 IContainer
扩展 Populate
解决问题,它是 DryIoc.Microsoft.DependencyInjection.
的一部分
我用它编辑了我的 ContainerSetup.cs 如下
public static class ContainerSetup
{
public static void Initialize(HostBuilderContext hostContext, IContainer container)
{
var services = new ServiceCollection();
services.AddHttpClient<MyTypedClient>()
.Configure[...];
container.Populate(services); // with this call all services registered above will be registered in the container
// register other stuff if necessary
container.Register<SomeService>();
}
}
IServiceCollection
有很多扩展 - 在我的例子中,我使用 AddHttpClient
。
我的方案是在 Startup.cs
中的 ConfigureServices
方法中注册一般内容,其中 IServiceCollection
用于注册服务。仅在特定项目中需要的所有内容都在相应项目的扩展方法中注册,但由于 DryIoc 容器必须集成到 ASP .NET Core 项目中,因此使用了 DryIoc IContainer
.
现在我有了一个只在特定项目中需要的HttpClient。因此,我想将它的注册放在各自的项目中。问题是我想为其使用 AddHttpClient,我通常只能与 IServiceCollection 一起使用。
我的问题:有没有办法在我的其他项目中使用它。也许通过从 DryIoc 容器或其他东西获取它。
这是所描述文件的一般结构:
Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.RegisterSomeService();
// register other stuff
}
}
Program.cs
public class Startup
{
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseServiceProviderFactory(new DryIocServiceProviderFactory())
.ConfigureContainer<Container>(SomeProject.ContainerSetup.Initialize);
}
ContainerSetup.cs 在 SomeProject
public static class ContainerSetup
{
public static void Initialize(HostBuilderContext hostContext, IContainer container)
{
container.Register<SomeService>();
// register other stuff
// here I want to use AddHttpClient
}
}
我建议查看 AddHttpClient https://source.dot.net/#Microsoft.Extensions.Http/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs,72bc67c4aadb77fc
并可能使用 IContainer
而不是服务集合进行相同的注册。
更新:
另一个想法是将IServiceCollection
注册到自身(或者它可能已经自动注册了?),然后从IContainer和AddHttpClient解析它..
我能够使用 IContainer
扩展 Populate
解决问题,它是 DryIoc.Microsoft.DependencyInjection.
我用它编辑了我的 ContainerSetup.cs 如下
public static class ContainerSetup
{
public static void Initialize(HostBuilderContext hostContext, IContainer container)
{
var services = new ServiceCollection();
services.AddHttpClient<MyTypedClient>()
.Configure[...];
container.Populate(services); // with this call all services registered above will be registered in the container
// register other stuff if necessary
container.Register<SomeService>();
}
}