标签: microsoft.extensions.hosting

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

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

如果可以的话,如果我不需要,我宁愿不只是更改该代码。

创建一个新的 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>();
}
Run Code Online (Sandbox Code Playgroud)

(这是来自记忆,所以可能不是 100% 正确,但这并不重要)

重要的变化是该void方法可以更改为返回一个IServiceProvider,它DryIoc可以为我提供。

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

重要的代码是这样的:

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

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

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

c# .net-core dryioc microsoft.extensions.hosting

5
推荐指数
1
解决办法
2523
查看次数

为什么 GetService 创建的对象不会被破坏?

我正在编写一个针对 dotnet core 框架 3.1 的应用程序。我使用依赖注入来配置数据库上下文等。在我的 Program.cs 中,我有以下代码:

var host = new HostBuilder()
    .ConfigureHostConfiguration(cfgHost =>
    {
        ...
    })
    .ConfigureAppConfiguration((hostContext, configApp) =>
    {
        ....
    })
    .ConfigureServices((hostContext, services) =>
    {
        ...
        services.AddDbContext<MyHomeContext>(options =>
        {
            options.UseNpgsql(hostContext.Configuration.GetConnectionString("DbContext"));
        }, ServiceLifetime.Transient);
        ...
    })
    .ConfigureLogging((hostContext, logging) =>
    {
        ...    
    })
    .Build();

Run Code Online (Sandbox Code Playgroud)

我转到host另一个班级。在另一个类中,作为较长方法的一部分,我有以下代码:

    using (var context = Host.Services.GetService(typeof(MyHomeContext)) as MyHomeContext)
    {
        StatusValues = context.Status.ToDictionary(kvp => kvp.Name, kvp => kvp.Id);
    }
    GC.Collect();
    GC.Collect();

Run Code Online (Sandbox Code Playgroud)

这些GC.Collect电话是出于测试/调查目的。在MyHomeContextI 中,出于测试目的,实现了析构函数和 Dispose() 的重写。Dispose() 被调用,但析构函数永远不会被调用。这会导致我创建的每个实例出现内存泄漏MyHomeContext

我缺少什么?MyHomeContext我可以做什么来确保当我不再需要它时删除它的实例。 …

c# memory-leaks dependency-injection microsoft.extensions.hosting

2
推荐指数
1
解决办法
1890
查看次数

无法在服务中注入IOptions

我正在尝试注入一个IOptions我创建的服务内部,它始终为null:

public class Startup
{
    private IConfiguration configuration;
    public Startup(IConfiguration config)
    {
        this.configuration = config; //gets injected from Main method , not null !
    }
    public void ConfigureServices(IServiceCollection services)
    {

        Config config = configuration.GetSection("Config").Get<Config>();
        services.Configure<Config>(configuration);
        services.AddTransient<StatusService>();
        services.AddCors();
        services.AddOptions();

    }
}
Run Code Online (Sandbox Code Playgroud)

服务

internal class StatusService
{
    private Config config;
    public StatusService(IOptions<Config>_config)
    {
      this.config=_config.Value; // _config has default fields
    }
}
Run Code Online (Sandbox Code Playgroud)

PS Config只是一个POCO,它在Program.Main使用UseConfiguration扩展的方法中填充.配置被解析好,所以没有问题Startup.我在构造函数中成功注入了配置.

c# asp.net-core microsoft.extensions.hosting

1
推荐指数
1
解决办法
353
查看次数