前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口。但是人都是充满好奇的,依赖注入到底是怎么实现的呢?微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真不好读)先看下核心类:ServiceTable internal class Se ...
前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口。但是人都是充满好奇的,依赖注入到底是怎么实现的呢?
微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真不好读)
先看下核心类:ServiceTable
internal class ServiceTable { private readonly object _sync = new object(); private readonly Dictionary<Type, ServiceEntry> _services; private readonly Dictionary<Type, List<IGenericService>> _genericServices; private readonly ConcurrentDictionary<Type, Func<ServiceProvider, object>> _realizedServices = new ConcurrentDictionary<Type, Func<ServiceProvider, object>>(); public ServiceTable(IEnumerable<ServiceDescriptor> descriptors) { _services = new Dictionary<Type, ServiceEntry>(); _genericServices = new Dictionary<Type, List<IGenericService>>(); foreach (var descriptor in descriptors) { var serviceTypeInfo = descriptor.ServiceType.GetTypeInfo(); if (serviceTypeInfo.IsGenericTypeDefinition) { Add(descriptor.ServiceType, new GenericService(descriptor)); } else if (descriptor.ImplementationInstance != null) { Add(descriptor.ServiceType, new InstanceService(descriptor)); } else if (descriptor.ImplementationFactory != null) { Add(descriptor.ServiceType, new FactoryService(descriptor)); } else { Add(descriptor.ServiceType, new Service(descriptor)); } } } public ConcurrentDictionary<Type, Func<ServiceProvider, object>> RealizedServices { get { return _realizedServices; } } public bool TryGetEntry(Type serviceType, out ServiceEntry entry) { lock (_sync) { if (_services.TryGetValue(serviceType, out entry)) { return true; } else if (serviceType.GetTypeInfo().IsGenericType) { var openServiceType = serviceType.GetGenericTypeDefinition(); List<IGenericService> genericEntry; if (_genericServices.TryGetValue(openServiceType, out genericEntry)) { foreach (var genericService in genericEntry) { var closedService = genericService.GetService(serviceType); if (closedService != null) { Add(serviceType, closedService); } } return _services.TryGetValue(serviceType, out entry); } } } return false; } public void Add(Type serviceType, IService service) { lock (_sync) { ServiceEntry entry; if (_services.TryGetValue(serviceType, out entry)) { entry.Add(service); } else { _services[serviceType] = new ServiceEntry(service); } } } public void Add(Type serviceType, IGenericService genericService) { lock (_sync) { List<IGenericService> genericEntry; if (!_genericServices.TryGetValue(serviceType, out genericEntry)) { genericEntry = new List<IGenericService>(); _genericServices[serviceType] = genericEntry; } genericEntry.Add(genericService); } } }
原标题:[Asp.net 5] DependencyInjection项目代码分析4
关键词:ASP.NET
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。