C# 从与Microsoft的接口解析类';什么是服务收集?

C# 从与Microsoft的接口解析类';什么是服务收集?,c#,C#,最近我一直在使用Microsoft的ServiceCollection作为DI容器,但我注意到它不支持解析。我检查了所有的方法,但没有任何地方显示它支持解析 我需要解析我用接口创建的一个单例,以便在创建它的范围之外的其他地方使用该实例。这有什么原因吗?这是我需要的属性注入。服务集合用于收集和注册所有服务。从那里,您可以从集合中构建一个服务提供者,以解析所需的服务 var services = new ServiceCollection(); services.AddSingleton<I

最近我一直在使用Microsoft的ServiceCollection作为DI容器,但我注意到它不支持解析。我检查了所有的方法,但没有任何地方显示它支持解析


我需要解析我用接口创建的一个单例,以便在创建它的范围之外的其他地方使用该实例。这有什么原因吗?这是我需要的属性注入。

服务集合用于收集和注册所有服务。从那里,您可以从集合中构建一个服务提供者,以解析所需的服务

var services = new ServiceCollection();

services.AddSingleton<IService, Service>();

//...add other services

IServiceProvider serviceProvider = services.BuildServiceProvider();

IService service = serviceProvider.GetService<IService>();
var services=newservicecolection();
services.AddSingleton();
//…添加其他服务
IServiceProvider serviceProvider=services.BuildServiceProvider();
IService service=serviceProvider.GetService();
如果您希望能够通过属性注入将一个服务分配给另一个服务,那么可以利用工厂委托作为参数来访问提供程序

比如说

services.AddTransient<IProvider>(sp => new Provider() {
    ServiceProperty = sp.GetService<IService>()
});
services.AddTransient(sp=>newprovider(){
ServiceProperty=sp.GetService()
});

解析
IProvider
时,将调用延迟的工厂委托,并根据需要使用提供程序注入依赖项。

您可以尝试使用下面的服务集合扩展,可以在

//实现IDisposable的服务:
公共类服务1:IDisposable{}
公共类服务2:IDisposable{}
公共类服务3:IDisposable{}
公共类SomeServiceImplementation:ISomeService,IDisposable{}
public void配置服务(IServiceCollection服务)
{
//容器将创建以下实例并自动处理它们:
services.addScope();
services.AddSingleton();
AddSingleton(sp=>newsomeServiceImplementation());
//容器不创建以下实例,因此它不处理
//实例将自动:
AddSingleton(新Service3());
AddSingleton(新Service3());
}

服务收集用于收集和注册所有服务。从那里,您可以从集合中构建一个服务提供者,以解析所需的服务。
// Services that implement IDisposable:
public class Service1 : IDisposable {}
public class Service2 : IDisposable {}
public class Service3 : IDisposable {}

public class SomeServiceImplementation : ISomeService, IDisposable {}

public void ConfigureServices(IServiceCollection services)
{
    // The container creates the following instances and disposes them automatically:
    services.AddScoped<Service1>();
    services.AddSingleton<Service2>();
    services.AddSingleton<ISomeService>(sp => new SomeServiceImplementation());


    // The container doesn't create the following instances, so it doesn't dispose of
    // the instances automatically:
    services.AddSingleton<Service3>(new Service3());
    services.AddSingleton(new Service3());
}