using System; using System.Collections.Generic; using System.Linq; using TinyIoC; namespace NzbDrone.Common.Composition { public class Container : IContainer { private readonly TinyIoCContainer _container; private readonly List _loadedTypes; public Container(TinyIoCContainer container, List loadedTypes) { _container = container; _loadedTypes = loadedTypes; _container.Register(this); } public void Register() where TImplementation : class, TService where TService : class { _container.Register(); } public TinyIoCContainer TinyContainer { get { return _container; } } public void Register(T instance) where T : class { _container.Register(instance); } public T Resolve() where T : class { return _container.Resolve(); } public object Resolve(Type type) { return _container.Resolve(type); } public void Register(Type serviceType, Type implementationType) { _container.Register(serviceType, implementationType); } public void Register(Func factory) where TService : class { _container.Register((c, n) => { return factory(this); }); } public void RegisterSingleton() where TImplementation : class, TService where TService : class { _container.Register().AsSingleton(); } public void RegisterSingleton() where T : class { _container.Register().AsSingleton(); } public void RegisterSingleton(Type service, Type implementation) { _container.Register(service, implementation).AsSingleton(); } public IEnumerable ResolveAll() where T : class { return _container.ResolveAll(); } public IEnumerable ResolveAll(Type type) { return _container.ResolveAll(type); } public void Register(Type registrationType, object instance) { _container.Register(registrationType, instance); } public void RegisterAllAsSingleton(Type registrationType, IEnumerable implementationList) { _container.RegisterMultiple(registrationType, implementationList).AsSingleton(); } public bool IsTypeRegistered(Type type) { return _container.CanResolve(type); } public IEnumerable GetImplementations(Type contractType) { return _loadedTypes .Where(implementation => contractType.IsAssignableFrom(implementation) && !implementation.IsInterface && !implementation.IsAbstract ); } } }