/// <summary>
            /// Register the feature
            /// </summary>
            /// <param name="createProxy"></param>
            private void Register(bool createProxy)
            {
                var featureType = _featureConfiguration.GetType();

                var serviceType = _fluentConfiguration._assemblyTypes
                                  .Where(x => x
                                         .GetConstructors()
                                         .Any(ctor => ctor
                                              .GetParameters()
                                              .Any() &&
                                              ctor
                                              .GetParameters()
                                              .All(param => param.ParameterType == featureType)))
                                  .Distinct()
                                  .SingleOrDefault();

                var interfaceType = serviceType.GetInterfaces().FirstOrDefault();

                object service = Activator.CreateInstance(serviceType, _featureConfiguration);

                if (createProxy)
                {
                    service = FeatureClient.CreateProxy(service, interfaceType, _featureConfiguration);
                }

                _fluentConfiguration._registrationCallback(interfaceType, () => service);
            }
Exemplo n.º 2
0
        /// <summary>
        /// CTOR
        /// </summary>
        /// <param name="configuration"></param>
        public Mediator(BaseFeatureConfiguration configuration)
        {
            if (configuration.IsNull() || configuration.MicroServiceConfiguration.IsNull())
            {
                throw new ArgumentNullException(nameof(configuration.MicroServiceConfiguration));
            }

            var requiringType = typeof(IFeature);
            var serverType    = Directory
                                .GetFiles(AppContext.BaseDirectory, "*.dll")
                                .Select(Assembly.LoadFrom)
                                .SelectMany(assembly => assembly.LoadAllTypesFromAssembly())
                                .Where(x => (x.GetInterfaces().Contains(requiringType) || x.IsSubclassOf(requiringType)) && !x.IsInterface && !x.IsAbstract)
                                .Where(x => x.GetConstructors().Any(ctor => ctor.GetParameters().Any() && ctor.GetParameters().All(param => param.ParameterType == configuration.GetType())))
                                .Distinct()
                                .SingleOrDefault();

            _server        = Activator.CreateInstance(serverType, configuration) as IFeature;
            _serverMethods = serverType.GetMethods().ToDictionary(x => x.Name, x => x);

            configuration.MicroServiceConfiguration.SendRequestsToMicroService = false;

            _configuration = configuration;
        }