/// <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); }
/// <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; }