private object GetOrCreateService(Dictionary <Type, object> service, Type serviceType, RegistryService registryService, Type[] genericArgs, List <IDisposable> disposables) { if (service.TryGetValue(serviceType, out var serviceInstance)) { return(serviceInstance); } serviceInstance = registryService.ServiceFac(registryService.LifeCycle, genericArgs); // if the service implement Idisposable , then add to _disposables list if (serviceInstance is IDisposable disposable) { disposables.Add(disposable); } service.Add(serviceType, serviceInstance); return(serviceInstance); }
public Container Register(Type from, Type to, LifeCycle lifeCycle) { // 沒有提供service factory時,自行建立service的instance Func <LifeCycle, Type[], object> serviceFac = (_, args) => CreateServiceInstance(to); var registryService = new RegistryService(from, lifeCycle, serviceFac); if (_registryTable.TryGetValue(from, out RegistryService existedService)) { _registryTable[from] = registryService; registryService.Next = existedService; } else { _registryTable.Add(from, registryService); } return(this); }
public Container Register(Type serviceType, Func <Container, object> service, LifeCycle lifeCycle = LifeCycle.Singleton) { var registryType = serviceType; Func <LifeCycle, Type[], object> serviceFac = (_, args) => service(this); var registryService = new RegistryService(registryType, lifeCycle, serviceFac); if (_registryTable.TryGetValue(registryType, out RegistryService existedService)) { _registryTable[registryType] = registryService; registryService.Next = existedService; } else { _registryTable.Add(registryType, registryService); } return(this); }
/// <summary> /// register service with given service instance /// </summary> /// <typeparam name="TFrom">the interface </typeparam> /// <typeparam name="Tto"></typeparam> /// <param name="service"></param> /// <param name="lifeCycle"></param> /// <returns></returns> public Container Register <TFrom, Tto>(Tto service, LifeCycle lifeCycle = LifeCycle.Singleton) where Tto : TFrom { var registryType = typeof(TFrom); Func <LifeCycle, Type[], object> serviceFac = (_, args) => service; var registryService = new RegistryService(registryType, lifeCycle, serviceFac); if (_registryTable.TryGetValue(registryType, out RegistryService existedService)) { _registryTable[registryType] = registryService; registryService.Next = existedService; } else { _registryTable.Add(registryType, registryService); } return(this); }
public Container Register <TService>(Func <Container, TService> service, LifeCycle lifeCycle = LifeCycle.Singleton) { var registryType = typeof(TService); // 有service factory時,用提供的factory method去建立方法 object serviceFac(LifeCycle _, Type[] args) => service(this); var registryService = new RegistryService(registryType, lifeCycle, serviceFac); if (_registryTable.TryGetValue(registryType, out RegistryService existedService)) { _registryTable[registryType] = registryService; registryService.Next = existedService; } else { _registryTable.Add(registryType, registryService); } return(this); }