gpt4 book ai didi

c# - 将 HostBuilder.ConfigureServices 与 DryIoc 容器一起使用?

转载 作者:太空狗 更新时间:2023-10-30 01:29:27 26 4
gpt4 key购买 nike

我有一些类库为我创建的应用程序提供服务,并且由于遗留原因,它们与 DryIoc 紧密绑定(bind)。 .也就是说,服务注册是紧密绑定(bind)的,而不是实际的服务。

如果可以的话,我宁愿在没有必要的情况下也不要四处更改代码。

创建新的 ASP.NET MVC Core 应用程序我能够通过更改 ConfigureServices 方法来使用 DryIoc 以返回 IServiceProvider像这样:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();

var container = new Container().WithDependencyInjectionAdapter(services);
return container.ConfigureServiceProvider<CompositionRoot>();
}

(这是内存中的,所以可能不是 100% 正确,但这并不重要)

重要的变化是 void方法可以更改为返回 IServiceProvider ,这DryIoc可以提供给我。

但是,对于 HostBuilder ,我想将其用于控制​​台应用程序、后台服务等。配置服务的方法不接受 IServiceProvider所以我不确定该怎么做。

重要的代码是这样的:

var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });

ConfigureServices上面的方法有一个重载和一个扩展方法:

  • ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
  • ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)

似乎没有关于返回或使用 IServiceProvider 的任何规定。或任何其他 DryIoc可以为我提供这方面的帮助。

这可能吗?有没有办法弥合差距?或者我只需要切换到使用 Microsoft IServiceCollection对于我的类(class)图书馆?由于它们在许多项目中都在使用,我宁愿不更改,只是因为在这个特定实例中它看起来最简单,但如果我必须这样做,我必须这样做。

最佳答案

@Nkosi 提供了一个不正确的答案(但在 ASP.NET 应用程序的上下文中是正确的) ,评论线程引发了关于方法 UseServiceProviderFactory 的讨论,结果证明是解决方案,所以谢谢你们。

要使用 UseServiceProviderFactory,我必须自己实现一个类,并将适当的 nuget 包引用添加到我的项目中。

步骤如下:

  1. 添加对 DryIoc.dll 的引用(不出所料)
  2. 添加对 DryIoc.Microsoft.DependencyInjection 的引用
  3. 修改注册码
  4. 提供UseServiceProviderFactory所需框架的自定义实现

原始代码如下所示:

var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });

这里是使用的东西:

var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})

//////////////////// ADD THIS vvvvvvvv
.UseServiceProviderFactory(new DryIocServiceProviderFactory())
.ConfigureContainer<Container>((hostContext, container) =>
{
container.Register<...>();
})
//////////////////// ADD THIS ^^^^^^^^


.ConfigureLogging((hostingContext, logging) => { ... });

然后提供 DryIocServiceProviderFactory 的实现:

internal class DryIocServiceProviderFactory : IServiceProviderFactory<IContainer>
{
public IContainer CreateBuilder(IServiceCollection services)
=> new Container().WithDependencyInjectionAdapter(services);

public IServiceProvider CreateServiceProvider(IContainer containerBuilder)
=> containerBuilder.ConfigureServiceProvider<CompositionRoot>();
}

上面的CompositionRoot 类在配置期间解析,构造函数可用于配置容器。可以使用什么都不做的虚拟类。

关于c# - 将 HostBuilder.ConfigureServices 与 DryIoc 容器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com