using System; using System.Linq; using System.Reflection; using SimpleInjector; using Tapeti.Annotations; using Tapeti.Default; using System.Collections.Generic; namespace Tapeti.SimpleInjector { public class SimpleInjectorDependencyResolver : IDependencyResolver, IDependencyInjector { private readonly Container container; public SimpleInjectorDependencyResolver(Container container, bool registerDefaults = true) { this.container = container; if (registerDefaults) RegisterDefaults(); } public T Resolve() where T : class { return container.GetInstance(); } public void RegisterPublisher(IPublisher publisher) { IfUnregistered(container.GetCurrentRegistrations(), () => container.RegisterSingleton(publisher)); } public void RegisterController(Type type) { container.Register(type); } public SimpleInjectorDependencyResolver RegisterDefaults() { var currentRegistrations = container.GetCurrentRegistrations(); IfUnregistered(currentRegistrations); IfUnregistered(currentRegistrations); IfUnregistered(currentRegistrations); return this; } private void IfUnregistered(IEnumerable currentRegistrations) where TService : class where TImplementation: class, TService { // ReSharper disable once SimplifyLinqExpression - not a fan of negative predicates if (!currentRegistrations.Any(ip => ip.ServiceType == typeof(TService))) container.Register(); } private void IfUnregistered(IEnumerable currentRegistrations, Action register) where TService : class { // ReSharper disable once SimplifyLinqExpression - not a fan of negative predicates if (!currentRegistrations.Any(ip => ip.ServiceType == typeof(TService))) register(); } } }