我有一些类库为我创建的应用程序提供服务,并且出于遗留原因,它们与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, …我正在编写一个针对 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
我正在尝试注入一个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.我在构造函数中成功注入了配置.