示例#1
0
        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);
        }
示例#2
0
        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;
                }
            }
        }