Example #1
0
 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);
         }
     }
 }
Example #2
0
        /// <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));
        }
Example #3
0
        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);
        }