diff --git a/SmallInjector.cs b/SmallInjector.cs index 98a2dee..7b6ea80 100644 --- a/SmallInjector.cs +++ b/SmallInjector.cs @@ -16,16 +16,17 @@ namespace SmallInjectorDemo /// Type of the service. /// Type of the interface of the service. /// True if the service should be singleton. False otherwise. - public void RegisterType(bool isSingleton) + /// instance of the service + public void RegisterType(bool isSingleton, TService instance = default(TService)) { - _container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton)); + _container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton, null)); } /// /// Register types in the resolve container. /// /// Type of the service. - public void RegisterType(bool isSingleton) => RegisterType(isSingleton); + public void RegisterType(bool isSingleton, TService instance = default(TService)) => RegisterType(isSingleton, instance); /// /// Resolve service of specified type. @@ -42,38 +43,33 @@ namespace SmallInjectorDemo public object Resolve(Type serviceInterface) { if (!_container.TryGetValue(serviceInterface, out var registeredType)) - { throw new Exception("Can't resolve dependency " + serviceInterface); - } - if (registeredType.IsSingleton && registeredType.SingletonInstance != null) - return registeredType.SingletonInstance; - var constructor = registeredType.ConcreteType.GetConstructors()[0]; + if (registeredType.IsSingleton && registeredType.Instance != null) + return registeredType.Instance; + var constructor = registeredType.ServiceType.GetConstructors()[0]; var parameters = constructor.GetParameters(); var constructorParameters = new object[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { constructorParameters[i] = Resolve(parameters[i].ParameterType); } - - if (registeredType.IsSingleton) - { - return registeredType.SingletonInstance ?? (registeredType.SingletonInstance = constructor.Invoke(constructorParameters)); - } - return constructor.Invoke(constructorParameters); + var instance = constructor.Invoke(constructorParameters); + return registeredType.IsSingleton ? (registeredType.Instance = instance) : instance; } private class RegisteredType { - public RegisteredType(Type concreteType, bool isSingleton) + public RegisteredType(Type serviceType, bool isSingleton, object instance) { - ConcreteType = concreteType; + ServiceType = serviceType; IsSingleton = isSingleton; + Instance = instance; } public readonly bool IsSingleton; - public readonly Type ConcreteType; - public object SingletonInstance { get; set; } + public readonly Type ServiceType; + public object Instance { get; set; } } } } \ No newline at end of file