public ShapeTable GetShapeTable(string themeName) { return(_cacheManager.Get(themeName ?? string.Empty, x => { Logger.Information("开始建立形状表格"); var alterationSets = _parallelCacheContext.RunInParallel(_bindingStrategies, bindingStrategy => { var strategyDefaultFeature = bindingStrategy.Metadata.ContainsKey("Feature") ? (Feature)bindingStrategy.Metadata["Feature"] : null; var builder = new ShapeTableBuilder(strategyDefaultFeature); bindingStrategy.Value.Discover(builder); return builder.BuildAlterations().ToArray(); }); var alterations = alterationSets .SelectMany(shapeAlterations => shapeAlterations) .Where(alteration => IsModuleOrRequestedTheme(alteration, themeName)) .OrderByDependenciesAndPriorities(AlterationHasDependency, GetPriority) .ToList(); var descriptors = alterations.GroupBy(alteration => alteration.ShapeType, StringComparer.OrdinalIgnoreCase) .Select(group => group.Aggregate( new ShapeDescriptor { ShapeType = group.Key }, (descriptor, alteration) => { alteration.Alter(descriptor); return descriptor; })).ToList(); foreach (var descriptor in descriptors) { foreach (var alteration in alterations.Where(a => a.ShapeType == descriptor.ShapeType).ToList()) { var local = new ShapeDescriptor { ShapeType = descriptor.ShapeType }; alteration.Alter(local); descriptor.BindingSources.Add(local.BindingSource); } } var result = new ShapeTable { Descriptors = descriptors.ToDictionary(sd => sd.ShapeType, StringComparer.OrdinalIgnoreCase), Bindings = descriptors.SelectMany(sd => sd.Bindings).ToDictionary(kv => kv.Key, kv => kv.Value, StringComparer.OrdinalIgnoreCase), }; _shapeTableEventHandlers.Invoke(ctx => ctx.ShapeTableCreated(result), Logger); Logger.Information("完成形状表格建立"); return result; })); }
public ShapeTable GetShapeTable(string themeName) { return _cacheManager.Get(themeName ?? string.Empty, x => { Logger.Information("开始建立形状表格"); var alterationSets = _parallelCacheContext.RunInParallel(_bindingStrategies, bindingStrategy => { var strategyDefaultFeature = bindingStrategy.Metadata.ContainsKey("Feature") ? (Feature)bindingStrategy.Metadata["Feature"] : null; var builder = new ShapeTableBuilder(strategyDefaultFeature); bindingStrategy.Value.Discover(builder); return builder.BuildAlterations().ToArray(); }); var alterations = alterationSets .SelectMany(shapeAlterations => shapeAlterations) .Where(alteration => IsModuleOrRequestedTheme(alteration, themeName)) .OrderByDependenciesAndPriorities(AlterationHasDependency, GetPriority) .ToList(); var descriptors = alterations.GroupBy(alteration => alteration.ShapeType, StringComparer.OrdinalIgnoreCase) .Select(group => group.Aggregate( new ShapeDescriptor { ShapeType = group.Key }, (descriptor, alteration) => { alteration.Alter(descriptor); return descriptor; })).ToList(); foreach (var descriptor in descriptors) { foreach (var alteration in alterations.Where(a => a.ShapeType == descriptor.ShapeType).ToList()) { var local = new ShapeDescriptor { ShapeType = descriptor.ShapeType }; alteration.Alter(local); descriptor.BindingSources.Add(local.BindingSource); } } var result = new ShapeTable { Descriptors = descriptors.ToDictionary(sd => sd.ShapeType, StringComparer.OrdinalIgnoreCase), Bindings = descriptors.SelectMany(sd => sd.Bindings).ToDictionary(kv => kv.Key, kv => kv.Value, StringComparer.OrdinalIgnoreCase), }; _shapeTableEventHandlers.Invoke(ctx => ctx.ShapeTableCreated(result), Logger); Logger.Information("完成形状表格建立"); return result; }); }
/// <summary> /// 发现形状。 /// </summary> /// <param name="builder">形状表格建造者。</param> public void Discover(ShapeTableBuilder builder) { builder.Describe("Layout") .Configure(descriptor => descriptor.Wrappers.Add("Document")) .OnCreating(creating => creating.Create = () => new ZoneHolding(() => creating.New.Zone())) .OnCreated(created => { var layout = created.Shape; layout.Head = created.New.DocumentZone(ZoneName: "Head"); layout.Body = created.New.DocumentZone(ZoneName: "Body"); layout.Tail = created.New.DocumentZone(ZoneName: "Tail"); layout.Body.Add(created.New.PlaceChildContent(Source: layout)); layout.Content = created.New.Zone(); layout.Content.ZoneName = "Content"; layout.Content.Add(created.New.PlaceChildContent(Source: layout)); layout.Breadcrumb = created.New.Zone(); layout.Breadcrumb.ZoneName = "Breadcrumb"; layout.Breadcrumb.Add(created.New.Breadcrumb(GetMenus: new Func<HttpRequestBase, RouteValueDictionary, IEnumerable<MenuItem>>((request, routeValues) => NavigationHelper.SetSelectedPath(_navigationManager.Value.BuildMenu("admin"), request, routeValues)))); layout.User = created.New.Zone(); layout.User.ZoneName = "User"; layout.User.Add(created.New.User()); }); builder.Describe("Zone") .OnCreating(creating => creating.Create = () => new Zone()) .OnDisplaying(displaying => { var zone = displaying.Shape; string zoneName = zone.ZoneName; zone.Classes.Add("zone-" + zoneName.HtmlClassify()); zone.Classes.Add("zone"); zone.Metadata.Alternates.Add("Zone__" + zoneName); }); builder.Describe("Menu") .OnDisplaying(displaying => { var menu = displaying.Shape; string menuName = menu.MenuName; menu.Metadata.Alternates.Add("Menu__" + EncodeAlternateElement(menuName)); }); builder.Describe("MenuItem") .OnDisplaying(displaying => { var menuItem = displaying.Shape; var menu = menuItem.Menu; menuItem.Metadata.Alternates.Add("MenuItem__" + EncodeAlternateElement(menu.MenuName)); }); builder.Describe("Breadcrumb") .OnDisplaying(displaying => { var shape = displaying.Shape; var metadata = shape.Metadata; metadata.Alternates.Add("Breadcrumb"); }); builder.Describe("User") .OnDisplaying(displaying => { var shape = displaying.Shape; var metadata = shape.Metadata; metadata.Alternates.Add("User"); }); }