public IHandler GetHandler(Type service) { _handlersByService.TryGetValue(service, out var serviceHandler); if (serviceHandler == null && service.GetTypeInfo().IsGenericType&& service.GetTypeInfo().IsGenericTypeDefinition == false) { var openService = service.GetGenericTypeDefinition(); var handlerCandidates = GetHandlers(openService); foreach (var handlerCandidate in handlerCandidates) { if (handlerCandidate.Supports(service)) { return(handlerCandidate); } } } var key = new ReplacementKey { Service = service, Implementation = serviceHandler?.Handler.ComponentModel.Implementation }; _replacementsByService.TryGetValue(key, out var replacement); if (replacement?.IsActive ?? false) { return(replacement.Handler); } _togglableHandlersByService.TryGetValue(service, out var togglableHandlers); // If replacement == null && togglableHandlers == null, this handler can be cached return (togglableHandlers? .FirstOrDefault(togglableHandler => togglableHandler.IsActive)?.Handler ?? serviceHandler?.Handler); }
private void RegisterReplacementByService(TogglableHandler togglableHandler) { foreach (var implementationType in togglableHandler.Replacement.Implementations) { foreach (var serviceType in togglableHandler.Replacement.Services) { var key = new ReplacementKey { Service = serviceType, Implementation = implementationType }; if (_replacementsByService.ContainsKey(key)) { throw new InvalidOperationException( $"Replacement of implementation '{implementationType.FullName}' " + $"and service '{serviceType.FullName}' already registered"); } _replacementsByService[key] = togglableHandler; } } }