Beispiel #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ServiceLocator"/> class.
        /// </summary>
        /// <param name="container">The container.</param>
        internal ServiceLocator(IServiceLocatorContainer container)
        {
            ArgumentChecker.NotNull(container, () => container);

            // Register self so that IServiceLocator can be resolved.
            container.RegisterSingleton <IServiceLocator, ServiceLocator>(this);

            _container = container;
        }
Beispiel #2
0
        /// <summary>
        /// Configures the specified container.
        /// </summary>
        /// <param name="container">The container.</param>
        public virtual void Configure(IServiceLocatorContainer container)
        {
            container.RegisterSingleton <ISetupManager, SetupManager>();
            container.RegisterSingleton <IInvocationTracker, InvocationTracker>();

            container.RegisterSingleton <Interceptor, Interceptor>();
            container.RegisterSingleton <EventInterceptor, EventInterceptor>();

            container.RegisterSingleton <ISetupMatcher, SetupMatcher>();
            container.RegisterSingleton <ITargetMatcher, TargetMatcher>();
            container.RegisterSingleton <IArgumentMatcher, ArgumentMatcher>();
            container.RegisterSingleton <IItIsMatcher, ItIsMatcher>();

            container.RegisterSingleton <IMethodDisassembler, MethodDisassembler>();
            container.RegisterSingleton <IAssemblyResolver, CecilAssemblyResolver>();

            container.RegisterSingleton <IExpressionDecompiler <Expression>, ExpressionDecompiler <Expression> >();
            container.RegisterSingleton <IExpressionDecompiler <Action>, ExpressionDecompiler <Action> >();
            container.RegisterSingleton <IExpressionCompiler, ExpressionCompiler>();
            container.RegisterSingleton <IExpressionHelper, ExpressionHelper>();
            container.RegisterSingleton <IInstructionsCompiler, DynamicMethodCompiler>();
            container.RegisterSingleton <IOpCodeMapper, OpCodeMapper>();
            container.RegisterSingleton <IMethodRewriter, MethodRewriter>();
            container.RegisterSingleton <IInstructionHelper, InstructionHelper>();
            container.RegisterSingleton <IParameterDeducer, ParameterDeducer>();
            container.RegisterSingleton <IArgumentGenerator, ArgumentGenerator>();

            container.RegisterSingleton <IAssemblyPostProcessor, AssemblyAttributesFilter>();
            container.RegisterSingleton <IAssemblyPostProcessor, ModuleMvidPostProcessor>();

            container.RegisterSingleton <ITypeResolver, TypeResolver>();
            container.RegisterSingleton <IModuleResolver, ModuleResolver>();
            container.RegisterSingleton <IFieldResolver, FieldResolver>();
            container.RegisterSingleton <IMethodResolver, MethodResolver>();

            container.RegisterSingleton <SetupExtractor, SetupExtractor>();
            container.RegisterSingleton <ISetupExtractor, SetupExtractor>();
            container.RegisterSingleton <IEventTargetExtractor, EventTargetExtractor>();
            container.RegisterSingleton <IEventAccessorExtractor, EventAccessorExtractor>();

            container.RegisterSingleton <IDependencyGraphBuilder, DependencyGraphBuilder>();

            container.RegisterSingleton <IModuleFilterFactory, ModuleFilterFactory>();

            container.Register <IEqualityComparer <ModuleReference>, ModuleReferenceComparer>();

            container.Register <ISmocksContext, SmocksContext>();

            container.Register <IServiceCreator, ServiceCreator>();
        }
        /// <summary>
        /// Configures the specified container.
        /// </summary>
        /// <param name="container">The container.</param>
        public virtual void Configure(IServiceLocatorContainer container)
        {
            container.RegisterSingleton<ISetupManager, SetupManager>();
            container.RegisterSingleton<IInvocationTracker, InvocationTracker>();

            container.RegisterSingleton<Interceptor, Interceptor>();
            container.RegisterSingleton<EventInterceptor, EventInterceptor>();

            container.RegisterSingleton<ISetupMatcher, SetupMatcher>();
            container.RegisterSingleton<ITargetMatcher, TargetMatcher>();
            container.RegisterSingleton<IArgumentMatcher, ArgumentMatcher>();
            container.RegisterSingleton<IItIsMatcher, ItIsMatcher>();

            container.RegisterSingleton<IMethodDisassembler, MethodDisassembler>();
            container.RegisterSingleton<IExpressionDecompiler<Expression>, ExpressionDecompiler<Expression>>();
            container.RegisterSingleton<IExpressionDecompiler<Action>, ExpressionDecompiler<Action>>();
            container.RegisterSingleton<IExpressionCompiler, ExpressionCompiler>();
            container.RegisterSingleton<IExpressionHelper, ExpressionHelper>();
            container.RegisterSingleton<IInstructionsCompiler, DynamicMethodCompiler>();
            container.RegisterSingleton<IOpCodeMapper, OpCodeMapper>();
            container.RegisterSingleton<IMethodRewriter, MethodRewriter>();
            container.RegisterSingleton<IInstructionHelper, InstructionHelper>();
            container.RegisterSingleton<IParameterDeducer, ParameterDeducer>();
            container.RegisterSingleton<IArgumentGenerator, ArgumentGenerator>();

            container.RegisterSingleton<ITypeResolver, TypeResolver>();
            container.RegisterSingleton<IModuleResolver, ModuleResolver>();
            container.RegisterSingleton<IFieldResolver, FieldResolver>();
            container.RegisterSingleton<IMethodResolver, MethodResolver>();

            container.RegisterSingleton<SetupExtractor, SetupExtractor>();
            container.RegisterSingleton<ISetupExtractor, SetupExtractor>();
            container.RegisterSingleton<IEventTargetExtractor, EventTargetExtractor>();
            container.RegisterSingleton<IEventAccessorExtractor, EventAccessorExtractor>();

            container.RegisterSingleton<IDependencyGraphBuilder, DependencyGraphBuilder>();

            container.RegisterSingleton<IModuleFilterFactory, ModuleFilterFactory>();

            container.Register<IEqualityComparer<ModuleReference>, ModuleReferenceComparer>();

            container.Register<ISmocksContext, SmocksContext>();

            container.Register<IServiceCreator, ServiceCreator>();
        }
Beispiel #4
0
        public void Constructor_ValidSetup_InvokesSetup()
        {
            var setupMock = new Mock <IServiceLocatorSetup>(MockBehavior.Strict);

            IServiceLocatorContainer calledContainer = null;

            setupMock
            .Setup(setup => setup.Configure(It.IsAny <IServiceLocatorContainer>()))
            .Callback <IServiceLocatorContainer>(container => calledContainer = container)
            .Verifiable();

            // Act
            var subject = new ServiceLocatorContainer(setupMock.Object);

            // Assert
            setupMock.Verify();
            Assert.AreEqual(subject, calledContainer);
        }
Beispiel #5
0
        private object[] ResolveArguments(IServiceLocatorContainer container, IEnumerable <Type> parameterTypes)
        {
            List <object> arguments = new List <object>();

            foreach (Type parameterType in parameterTypes)
            {
                object argument;

                if (container.TryResolve(parameterType, out argument))
                {
                    arguments.Add(argument);
                }
                else
                {
                    return(null);
                }
            }

            return(arguments.ToArray());
        }
Beispiel #6
0
        private object[] ResolveArguments(IServiceLocatorContainer container, IEnumerable<Type> parameterTypes)
        {
            List<object> arguments = new List<object>();

            foreach (Type parameterType in parameterTypes)
            {
                object argument;

                if (container.TryResolve(parameterType, out argument))
                {
                    arguments.Add(argument);
                }
                else
                {
                    return null;
                }
            }

            return arguments.ToArray();
        }
Beispiel #7
0
        public object Create(Type type, IServiceLocatorContainer container)
        {
            ArgumentChecker.NotNull(type, () => type);

            // Prefer constructors with more parameters
            var constructors = type
                               .GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                               .OrderByDescending(constructor => constructor.GetParameters().Length)
                               .ToList();

            foreach (var constructor in constructors)
            {
                object[] arguments = ResolveArguments(container,
                                                      constructor.GetParameters().Select(parameter => parameter.ParameterType));

                if (arguments != null)
                {
                    return(constructor.Invoke(arguments));
                }
            }

            throw new InvalidOperationException("No suitable constructor found for " + type.Name);
        }
Beispiel #8
0
        public object Create(Type type, IServiceLocatorContainer container)
        {
            ArgumentChecker.NotNull(type, () => type);

            // Prefer constructors with more parameters
            var constructors = type
                .GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                .OrderByDescending(constructor => constructor.GetParameters().Length)
                .ToList();

            foreach (var constructor in constructors)
            {
                object[] arguments = ResolveArguments(container,
                    constructor.GetParameters().Select(parameter => parameter.ParameterType));

                if (arguments != null)
                {
                    return constructor.Invoke(arguments);
                }
            }

            throw new InvalidOperationException("No suitable constructor found for " + type.Name);
        }