Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 如何从现有的IServiceCollection创建IServiceCollection?_C#_Asp.net Core - Fatal编程技术网

C# 如何从现有的IServiceCollection创建IServiceCollection?

C# 如何从现有的IServiceCollection创建IServiceCollection?,c#,asp.net-core,C#,Asp.net Core,假设我有一些子应用程序,需要在主应用程序中注册一些服务,再加上它自己的一些特定服务。我想知道是否有更好的/自然的方法来实现这一点(也许有一些扩展方法?)。这就是我所做的: public static IServiceCollection ConfigureServices(this IServiceCollection main) { IServiceCollection sub = new ServiceCollection(); foreach (var serv in ma

假设我有一些子应用程序,需要在主应用程序中注册一些服务,再加上它自己的一些特定服务。我想知道是否有更好的/自然的方法来实现这一点(也许有一些扩展方法?)。这就是我所做的:

public static IServiceCollection ConfigureServices(this IServiceCollection main)
{
    IServiceCollection sub = new ServiceCollection();
    foreach (var serv in main)
    {
        sub.Add(serv);
    }
    return sub;
}

谢谢。

您可以使用
IWebHostBuilder的
ConfigureServices
方法来注入服务集合。然后该实例将被传递到启动类的
ConfigureServices
方法。我认为扩展方法是一条出路。但是,在我看来,将扩展方法重命名为
AddRange
是有意义的:

WebHost.CreateDefaultBuilder(args)
        .ConfigureServices(servicesCollection =>
         {
             var mainServiceCollection = ...;
             servicesCollection.AddRange(mainServiceCollection);
         })
        .UseStartup<Startup>();

谢谢你的回答。我希望得到类似于
var newServices=currentServices.CreateChild()
之类的东西。我已经有了
IServiceCollection
实例,我正在迭代它来构建新实例。@dcg哦,找到了,更新了我的答案。我认为在这种情况下,扩展方法是可行的。
public static IServiceCollection AddRange(this IServiceCollection current, IServiceCollection main)
{
    if(current == null)
    {
        throw ArgumentNullException();
    }

    foreach (var serv in main)
    {
        current.Add(serv);
    }

    return current;
}