IServiceProvider扩展


  IServiceProvider扩展的类名为 ServiceProviderExtension,是对 System.IServiceProvider 的扩展。你可以把 IServiceProvider 看作是一个 IOC 的管道,它的 GetService 方法用于从容器中获取指定类型的对象。

1、尝试获取服务对象

  TryGetService 方法尝试从 IServiceProvider 对象中获取指定类型的对象,如果对象不存在,则使用 creator 委托创建一个对象。如下所示:

[TestMethod]
public void TryGetService()
{
    var container = ContainerUnity.GetContainer();
    var cacheMgr = container.TryGetService<ICacheManager>(() => new MemoryCacheManager());
        Assert.IsNotNull(cacheMgr);
}

2、获取IServiceProvider

  如果一个类实现了 IServiceProviderAccessor 接口,提供了 IServiceProvider 对象的访问,则 TryGetServiceProvider 方法可以从此对象中获取到 IServiceProvider 对象。如下所示:

public class SingleService : IServiceProviderAccessor
{
    public SingleService(IServiceProvider serviceProvider)
    {
        ServiceProvider = serviceProvider
    }
        
    public IServiceProvider ServiceProvider { get; set; }
}

[TestMethod]
public void TestTryGetServiceProvider()
{
    var container = ContainerUnity.GetContainer();
    var obj = new SingleService(container);
    var serviceProvider = obj.TryGetServiceProvider();
    Assert.IsNotNull(serviceProvider);
}

3、设置IServiceProvider

  如果一个类实现了 IServiceProviderAccessor 接口,提供了 IServiceProvider 对象的访问,则 TrySetServiceProvider 方法可以将一个 IServiceProvider 对象赋值到其对象内部。如下所示:

[TestMethod]
public void TestTrySetServiceProvider()
{
    var container = ContainerUnity.GetContainer();
    var obj = new SingleService(container);
    obj.TrySetServiceProvider(new Container());
}

4、尝试创建Scope

  TryCreateScope 方法用于创建一个作用域,在 .Net Standard 下返回一个 IServiceScope 对象,而在 .Net Framework 下则返回一个 IResolver 对象,它们都提供了 IServiceProvider 对象的访问。如下所示:

[TestMethod]
public void TestTryCreateScope()
{
    var container = ContainerUnity.GetContainer();
    using (var scope = container.TryCreateScope())
    {
        Assert.IsNotNull(scope.ServiceProvider);
    }
}