小编Jin*_*ish的帖子

实体框架核心2.0.1渴望加载所有嵌套的相关实体

我有一个简单的问题,但似乎找不到解决方法.我正在使用Entity Framework Core版本2.0.1,并且希望默认情况下急切加载我的所有实体.

例:

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; }
}

public class Customer
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public int AddressId { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# eager-loading entity-framework-core

12
推荐指数
2
解决办法
8332
查看次数

有没有办法在Asp.Net core 3.1中手动启动BackgroundService

我知道在Asp.Net 3.0(或3.1)之前,要手动启动BackgroundService,我们可以从中派生它IHostedService并将DI注册更改为:

services.AddSingleton<IHostedService, CustomHostedService>();
Run Code Online (Sandbox Code Playgroud)

然后通过在构造函数中注入服务并调用 来手动触发服务启动StartAsync()

但是,我似乎无法在 Asp.Net Core 3.1 中做到这一点。看一下该StartAsync()方法的代码,后台服务是在应用程序启动完成之前启动的。

public async Task StartAsync(CancellationToken cancellationToken = default)
{
    _logger.Starting();
    await _hostLifetime.WaitForStartAsync(cancellationToken);

    cancellationToken.ThrowIfCancellationRequested();
    _hostedServices = Services.GetService<IEnumerable<IHostedService>>();

    foreach (var hostedService in _hostedServices)
    {
        // Fire IHostedService.Start
        await hostedService.StartAsync(cancellationToken).ConfigureAwait(false);
    }

    // Fire IApplicationLifetime.Started
    _applicationLifetime?.NotifyStarted();

    _logger.Started();
}
Run Code Online (Sandbox Code Playgroud)

手动触发后台服务启动的最佳方法是什么?

本质上,这是我的设置:

后台服务

public MyBackgroundService(Func<string, IConsumer> consumerFactory)
{
    _consumerFactory = consumerFactory ?? throw new ArgumentNullException(nameof(consumerFactory));
}
Run Code Online (Sandbox Code Playgroud)

消费者工厂注册

services.AddSingleton<Func<string, IConsumer>>(provider => providerName => provider.ConfigureConsumer(environment, providerName));

private static IConsumer ConfigureConsumer(this IServiceProvider provider, …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core asp.net-core-3.1 ihostedservice

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

.NET Core DI 使用自定义委托解析键控服务返回 null

我正在处理一个奇怪的案件。我有一个 .NET Core 控制台应用程序,其设置如下:

private static async Task Main(string[] args)
{
    var runAsService = !(Debugger.IsAttached || args.Contains("console"));
    var builder = new HostBuilder()
        .ConfigureServices((hostContext, services) =>
        {
            services.AddLogging(loggingBuilder => { loggingBuilder.AddConsole(); });

            services.AddGatewayServers();
            services.AddHostedService<GatewayService>();
        });

    if (runAsService)
        await builder.RunServiceAsync();
    else
        await builder.RunConsoleAsync();
}
Run Code Online (Sandbox Code Playgroud)

然后我IServiceCollection对此设置进行了扩展AddGatewayServers(),如下所示:

public static void AddGatewayServers(this IServiceCollection services)
{
    services.AddTransient<IGatewayServer, Server1>();
    services.AddTransient<IGatewayServer, Server2>();
    services.AddTransient<Func<ServerType, IGatewayServer>>(provider => key =>
    {
        switch (key)
        {
            case ServerType.Type1: return provider.GetService<Server1>();
            case ServerType.Type2: return provider.GetService<Server2>();
            default: return null;
        }
    }); …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection .net-core .net-core-2.2

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