private static void SetupServiceDescriptors(ShellBlueprint blueprint, List <SmartServiceDescriptor> smartServiceDescriptors) { foreach (var item in blueprint.DependencyDescribers) { var constructor = item.Type.GetTypeInfo().GetConstructors(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(c => c.GetParameters().Length == 0); if (constructor == null) { throw new SchubertException($@"类型 {item.Type.FullName} 实现了 {nameof(IDependencyDescriber)} 接口,必须提供公共无参构造函数。"); } IDependencyDescriber d = (IDependencyDescriber)Activator.CreateInstance(item.Type); foreach (var descriptor in d.Build()) { smartServiceDescriptors.Add(descriptor); } } }
/// <summary> /// 获取蓝图中的依赖项和事件。 /// </summary> private Tuple <IEnumerable <SmartServiceDescriptor>, IEnumerable <EventSubscriptionDescriptor> > BuildDependencies(ShellBlueprint blueprint) { List <SmartServiceDescriptor> smartServiceDescriptors = new List <SmartServiceDescriptor>(); smartServiceDescriptors.Add(ServiceDescriber.Instance(blueprint, SmartOptions.Replace)); smartServiceDescriptors.Add(ServiceDescriber.Instance(blueprint.Descriptor, SmartOptions.Replace)); SetupServiceDescriptors(blueprint, smartServiceDescriptors); List <EventSubscriptionDescriptor> eventSubs = new List <EventSubscriptionDescriptor>(); SetupDependencies(blueprint, smartServiceDescriptors, eventSubs); return(new Tuple <IEnumerable <SmartServiceDescriptor>, IEnumerable <EventSubscriptionDescriptor> >(smartServiceDescriptors, eventSubs)); }
private ShellBlueprint BuildBlueprint(ShellDescriptor descriptor, IEnumerable <Feature> features, IEnumerable <String> excludeTypes) { _logger.WriteInformation($"开始加载蓝图(app: {_appName})。"); string[] feautureNames = features.Select(f => f.Descriptor.Name).ToArray(); string[] modules = features.Select(f => f.Descriptor.ModuleName).Distinct().ToArray(); var items = new Dictionary <String, List <ShellBlueprintItem> >(); ShellBlueprint blueprint = new ShellBlueprint() { Features = feautureNames, Modules = modules }; foreach (var f in features) { if (f.Descriptor.ModuleName.Equals(FrameworkFeatureName)) { continue; } if (!f.ExportedTypes.Any()) { this._logger.WriteTrace($"跳过 Feature ( Name={f.Descriptor.Name}, Module={f.Descriptor.ModuleName} ),由于没有导出类型。"); continue; } this.BeginTrace(); this.AddTraceLine($"加载 Feature ( Name={f.Descriptor.Name}, Module={f.Descriptor.ModuleName} )"); foreach (Type t in f.ExportedTypes) { if (!excludeTypes.Contains(t.FullName)) { foreach (var e in _exporters) { if (e.CanExport(t)) { var item = e.Export(t, f); if (item != null) { var list = items.GetOrAdd(e.Category, c => new List <ShellBlueprintItem>()); list.Add(item); this.AddTraceLine($"发现 {e.Category}:{t.Name}。"); } } } } } this.EndTrace(); } var saveItems = new Dictionary <String, IEnumerable <ShellBlueprintItem> >(items.Count); foreach (var kv in items) { saveItems.Add(kv.Key, kv.Value.ToArray()); } //设置蓝图。 blueprint.Descriptor = descriptor; blueprint.ExportedItems = saveItems; _logger.WriteInformation($"蓝图加载完成。"); return(blueprint); }