收藏 分享(赏)

DependencyInjection项目代码分析4-微软的实现(3).docx

上传人:hyngb9260 文档编号:4684504 上传时间:2019-01-07 格式:DOCX 页数:9 大小:23.25KB
下载 相关 举报
DependencyInjection项目代码分析4-微软的实现(3).docx_第1页
第1页 / 共9页
DependencyInjection项目代码分析4-微软的实现(3).docx_第2页
第2页 / 共9页
DependencyInjection项目代码分析4-微软的实现(3).docx_第3页
第3页 / 共9页
DependencyInjection项目代码分析4-微软的实现(3).docx_第4页
第4页 / 共9页
DependencyInjection项目代码分析4-微软的实现(3).docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、这个系列已经写了 5篇,链接地址如下:A 5 DependencyInjection项目代码分析A 5 DependencyInjection项目代码分析 2-AutofacA 5 DependencyInjection项目代码分析 3-NinjectA 5 DependencyInjection项目代码分析 4-微软的实现(1)A 5 DependencyInjection项目代码分析 4-微软的实现(2)如果想对本篇有个更好的了解,建议需要先看“A 5 DependencyInjection项目代码分析”“A 5 DependencyInjection项目代码分析 4-微软的实现(1)”“

2、A 5 DependencyInjection项目代码分析 4-微软的实现(2)”。在之前的“上“、”中“俩篇已经介绍了ServiceTable、IGenericService、IService、IServiceCallSite、ServiceEntry、GenericService、InstanceService、FactoryService、Service 等类。本节主要介绍核心的”ServiceProvider“类。IServiceProvider类IServiceProvider类是微软这套 DependencyInjection中直接对外的接口。而ServiceProvider是直接

3、实现 IServiceProvider并且对外直接提供功能的核心类。对于 ServiceProvider不仅要能够获取注入的类,还需要根据不同定义的范围获取不同范围的注入类。对于不同的范围(Transient、Scoped、Singleton),ServiceProvider需要使用不同的逻辑。我们简单分析下。 对于 Transient,每次都创建一个新的实例,所以代码中只需直接创建该注入类的实例即可,不需要对该类进行缓存; 对于 Singleton,全局只有一个实例,代码中可以将创建的对象缓存到静态的字典表中,之后每次需要该类型实例首先到全局静态字典表中去查找如果存在则直接返回,不存在创建后

4、加入到字典表中,之后返回。( 实际上源码中并未缓存到全局变量中,具体实现方式后面会讲解 ) 对于 Scoped,每个 Scope内是唯一的,不同 Scope范围是不同的。这个就比较难实现。不过我们可以通过外部调用的代码简单的猜测下,之后我们通过查看源代码进行验证。下面是不同 Scoped范围的代码调用。public void ScopedServiceCanBeResolved()IServiceProvider container = CreateContainer();var scopeFactory = container.GetService();using (var scope =

5、scopeFactory.CreateScope()var containerScopedService = container.GetService();var scopedService1 = scope.ServiceProvider.GetService();var scopedService2 = scope.ServiceProvider.GetService();Assert.NotEqual(containerScopedService, scopedService1);Assert.Equal(scopedService1, scopedService2);Factpubli

6、c void NestedScopedServiceCanBeResolved()IServiceProvider container = CreateContainer();IServiceScopeFactory outerScopeFactory = container.GetService();using (var outerScope = outerScopeFactory.CreateScope()var innerScopeFactory = outerScope.ServiceProvider.GetService();using (var innerScope = inner

7、ScopeFactory.CreateScope()var outerScopedService = outerScope.ServiceProvider.GetService();var innerScopedService = innerScope.ServiceProvider.GetService();Assert.NotEqual(outerScopedService, innerScopedService);CreateScope我们可以根据不同 Scoped的注入实例,实际上是通过获取 不同的IServiceScope对象 的 ServiceProvider属性,之后通过该属性创

8、建。由于是不同的 IServiceScope对象,我们可以大胆的假设 IServiceScope对象的ServiceProvider属性也是不同的 IServiceProvider对象。所以每个ServiceProvider对象内部,只需要维护一份注入对象的副本即可;由于IServiceScope对象实现了 IDisposable接口(用在 using上的对象,都实现了 IDisposable接口,当 using范围结束后,会自动调用 IDisposable的Dispose方法),但注入的对象缓存在 IServiceScope的 ServiceProvider属性对象中,所以我们让 Servi

9、ceProvider类也实现 IDisposable接口,在IServiceScope的 Dispose方法内部调用 ServiceProvider类的 Dispose方法即可。通过上面的分析,我们可以大致想象出 ServiceProvider类的定义,下面就是ServiceProvider类缩减的源代码:internal class ServiceProvider : IServiceProvider, IDisposableprivate readonly object _sync = new object();private readonly ServiceProvider _root;

10、private readonly ServiceTable _table;private readonly Dictionary _resolvedServices = new Dictionary();private ConcurrentBag _disposables = new ConcurrentBag();public ServiceProvider(IEnumerable serviceDescriptors)_root = this;_table = new ServiceTable(serviceDescriptors);_table.Add(typeof(IServicePr

11、ovider), new ServiceProviderService();_table.Add(typeof(IServiceScopeFactory), new ServiceScopeService();_table.Add(typeof(IEnumerable), new OpenIEnumerableService(_table);internal ServiceProvider(ServiceProvider parent)_root = parent._root;_table = parent._table;ServiceProvider的属性我们已经讲完,那我们继续看下构造函数

12、内其他的东西(上面的代码就是其构造函数)。我们发现 ServiceTable内额外添加IServiceProvider、IServiceScopeFactory、IEnumerable的注入,由于篇幅有限,将额外介绍,该处就略过了。internal class ServiceProviderService : IService, IServiceCallSitepublic IService Next get; set; public ServiceLifetime Lifetimeget return ServiceLifetime.Scoped; public IServiceCallSi

13、te CreateCallSite(ServiceProvider provider, ISet callSiteChain)return this;public object Invoke(ServiceProvider provider)return provider;public Expression Build(Expression provider)return provider;ServiceProviderService internal class ServiceScopeService : IService, IServiceCallSitepublic IService N

14、ext get; set; public ServiceLifetime Lifetimeget return ServiceLifetime.Scoped; public IServiceCallSite CreateCallSite(ServiceProvider provider, ISet callSiteChain)return this;public object Invoke(ServiceProvider provider)return new ServiceScopeFactory(provider);public Expression Build(Expression pr

15、ovider)return Expression.New(typeof(ServiceScopeFactory).GetTypeInfo().DeclaredConstructors.Single(),provider);internal class ServiceScopeFactory : IServiceScopeFactoryprivate readonly ServiceProvider _provider;public ServiceScopeFactory(ServiceProvider provider)_provider = provider;public IServiceS

16、cope CreateScope()return new ServiceScope(new ServiceProvider(_provider);internal class ServiceScope : IServiceScopeprivate readonly ServiceProvider _scopedProvider;public ServiceScope(ServiceProvider scopedProvider)_scopedProvider = scopedProvider;public IServiceProvider ServiceProviderget return _scopedProvider; public void Dispose()_scopedProvider.Dispose();ServiceScopeService、ServiceScopeFactory、ServiceScope

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 微软认证

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报