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);
}
}