你的位置:首页 > 软件开发 > ASP.net > [Asp.net 5] DependencyInjection项目代码分析4

[Asp.net 5] DependencyInjection项目代码分析4

发布时间:2015-05-23 00:04:01
前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口。但是人都是充满好奇的,依赖注入到底是怎么实现的呢?微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真不好读)先看下核心类:ServiceTable internal class Se ...

前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口。但是人都是充满好奇的,依赖注入到底是怎么实现的呢?

微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真不好读)

先看下核心类:ServiceTable

[Asp.net 5] DependencyInjection项目代码分析4[Asp.net 5] DependencyInjection项目代码分析4
 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 (#换成@)。