static void Main(string[] args) { IAssemblyTypeLoader assemblyTypeLoader = new AssemblyTypeLoader(); IAppConfiguration configuration = new AppConfiguration(); try { var inputDataProvider = assemblyTypeLoader.LoadType<IInputDataProvider>(configuration.ProviderFactoryAssemblyPath); var dataPersistor = assemblyTypeLoader.LoadType<IOutputDataPersistor>(configuration.ProviderFactoryAssemblyPath); LaunchSentenceProcessing(inputDataProvider, dataPersistor); } catch (ConfigurationErrorsException ex) { Console.WriteLine("An error occurred during the configuration load. Please check AppConfig is correctly set up. Error details: {0}", ex.Message); } catch(ArgumentNullException ex) { Console.WriteLine("An error occurred. Error details: {0}", ex.Message); } catch(ArgumentException ex) { Console.WriteLine("An error occurred. Provided path is incorrect. Error details: {0}", ex.Message); } catch (IOException ex) { Console.WriteLine("An error occurred during the assembly load. Please check if, dependencies are correctly set up. Error details: {0}", ex.Message); } catch (TypeLoadException ex) { Console.WriteLine("An error occurred during the assembly load. Error details: {0}", ex.Message); } Console.WriteLine("Application has finished running and will be closed after key press."); Console.ReadKey(); }
/// <summary> /// Get service definitions. /// </summary> /// <returns>Service definitions.</returns> private static IEnumerable <IServiceDefinition> GetServicesDefinition() { var serviceList = new List <IServiceDefinition>(); IEnumerable <Assembly> assembiles = AssemblyLoader.LoadAll(); IEnumerable <Type> services = assembiles.SelectMany(assembly => AssemblyTypeLoader.GetTypes(assembly, ContainsAutoSetupServiceAttribute)); var serviceGroup = services.SelectMany(service => service.GetCustomAttributes <DependencyInjectionAttribute>().Select(attr => new { Attr = attr, Impl = service })) .GroupBy(define => define.Attr.Service); foreach (var service in serviceGroup) { var highPriorityImpl = service.OrderByDescending(impl => impl.Attr.Priority).First(); serviceList.Add(new ServiceDefinition(highPriorityImpl.Attr.Service, highPriorityImpl.Impl, highPriorityImpl.Attr.LifeTime)); } return(serviceList); }
/// <summary> /// 通过Xml节点加载数据 /// </summary> /// <param name="node">节点</param> /// <param name="assemblyTypeLoader">节点</param> /// <returns></returns> public static Type LoadFromXmlNode(XmlNode node, AssemblyTypeLoader loader) { string assembly = null; string typeName = null; foreach (XmlAttribute att in node.Attributes) { if (att.Name.Equals("assembly", StringComparison.CurrentCultureIgnoreCase)) { assembly = att.InnerText; } else if (att.Name.Equals("type", StringComparison.CurrentCultureIgnoreCase)) { typeName = att.InnerText; } } return(loader.LoadType(typeName, assembly)); }
public void AddService(IServiceCollection service) { var assembiles = AssemblyLoader.LoadAll(); var services = assembiles .SelectMany(assembly => AssemblyTypeLoader.GetTypes(assembly, ContainsDependencyInjectionAttribute)); var serviceGroup = services .SelectMany(s => s.GetCustomAttributes <DependencyInjectionAttribute>().Select(attr => new { Attr = attr, Impl = s })).GroupBy(define => define.Attr.Service); foreach (var s in serviceGroup) { var instance = s.FirstOrDefault(); if (instance == null) { continue; } //注入 service.AddSingleton(instance.Attr.Service, instance.Impl); } }