Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net核心DI,使用一个依赖项中的值注册另一个依赖项_C#_.net_Asp.net Core_Dependency Injection_.net Core - Fatal编程技术网

C# .net核心DI,使用一个依赖项中的值注册另一个依赖项

C# .net核心DI,使用一个依赖项中的值注册另一个依赖项,c#,.net,asp.net-core,dependency-injection,.net-core,C#,.net,Asp.net Core,Dependency Injection,.net Core,我使用的是.NETCore2.1,在这种情况下,我正在向本机IoC容器注册一个服务,并且需要其中的一个值来注册另一组服务 var hostBuilder = new HostBuilder() .ConfigureServices((hostContext, services) => { services .AddSingleton<IFirstService, FirstService>() .AddMySer

我使用的是.NETCore2.1,在这种情况下,我正在向本机IoC容器注册一个服务,并且需要其中的一个值来注册另一组服务

var hostBuilder = new HostBuilder()
    .ConfigureServices((hostContext, services) => 
    {
        services
        .AddSingleton<IFirstService, FirstService>()
        .AddMyServices(FirstService.MyProperty);
    });

FirstService.MyProperty
传递到
AddMyServices

中的好方法是什么?您可以从IServiceCollection获得注册服务,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IFirstService, FirstService>();

    var serviceProvider = services.BuildServiceProvider();
    var firstService = serviceProvider.GetService<IFirstService>();
    // now pass firstService to AddMyServices method or get that directly in it
}
public void配置服务(IServiceCollection服务)
{
services.AddTransient();
var serviceProvider=services.BuildServiceProvider();
var firstService=serviceProvider.GetService();
//现在将firstService传递给AddMyServices方法,或者直接从中获取该方法
}

您可以从IServiceCollection获得注册服务,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IFirstService, FirstService>();

    var serviceProvider = services.BuildServiceProvider();
    var firstService = serviceProvider.GetService<IFirstService>();
    // now pass firstService to AddMyServices method or get that directly in it
}
public void配置服务(IServiceCollection服务)
{
services.AddTransient();
var serviceProvider=services.BuildServiceProvider();
var firstService=serviceProvider.GetService();
//现在将firstService传递给AddMyServices方法,或者直接从中获取该方法
}
那么:

公共静态IServiceCollection AddMyServices(此IServiceCollection服务集合)
{
serviceCollection.AddTransient(sp=>
{
var firstService=sp.GetRequiredService()作为firstService;
var firstProperty=firstService.firstProperty;
//基于属性生成ISomeService的实例
});
}
这将为依赖于第一个服务的依赖项注册工厂。 当然,您需要为每个服务执行以下操作:/

您还可以将属性添加到IFirstService界面,这样就不需要强制转换服务。

如何:

公共静态IServiceCollection AddMyServices(此IServiceCollection服务集合)
{
serviceCollection.AddTransient(sp=>
{
var firstService=sp.GetRequiredService()作为firstService;
var firstProperty=firstService.firstProperty;
//基于属性生成ISomeService的实例
});
}
这将为依赖于第一个服务的依赖项注册工厂。 当然,您需要为每个服务执行以下操作:/


您还可以将您的属性添加到IFirstService界面,这样您就不需要强制转换服务。

是否
FirstService.MyProperty
确定注册了哪些后续服务?否,它只是第二个服务的一个参数。是否
FirstService.MyProperty
确定注册了哪些后续服务?否,这只是第二个容器的一个参数,请务必小心,因为这会创建一个具有唯一缓存的新“容器”。这很容易导致“撕裂的生活方式”。这意味着您将获得一个
单例注册的多个实例,这可能会导致奇怪的错误。除非您可以保证BuildServiceProvider只被调用一次,否则不要这样做。只有在不使用HostBuilder的情况下手动使用ServiceCollection时,我才会这样做。请非常小心,因为这会创建一个具有唯一缓存的新“容器”。这很容易导致“撕裂的生活方式”。这意味着您将获得一个
单例注册的多个实例,这可能会导致奇怪的错误。除非您可以保证BuildServiceProvider只被调用一次,否则不要这样做。只有在没有HostBuilder的情况下手动使用ServiceCollection时,我才会这样做。嘿,这看起来不错。如果添加的是
DbContext
,而不是
ISomeService
servicecolection.AddDbContext()
)。如何使用它。嗯。。。在这种情况下,您可能需要重新实现AddDbContext。嘿,这看起来不错。如果添加的是
DbContext
,而不是
ISomeService
servicecolection.AddDbContext()
)。如何使用它。嗯。。。在这种情况下,您可能需要重新实现AddDbContext。