public AddinConfiguration(IMessageDialog dialog, INameConvention nameConvention) : this(dialog, new FileConfiguration(), nameConvention, new ReflectionExtensionBuilderFactory(), new ReflectionExtensionPointFactory()) { }
internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { var result = true; if (ExtensionPointName == null) { resolutionResult.AddError("An id of extension point must have an parent!"); result = false; } if (ParentPath == null) { resolutionResult.AddError("An extension builder must have an parent!"); result = false; } if (TypeName.IsNullOrWhiteSpace()) { resolutionResult.AddError("An extension builder must at least provide a type name!"); result = false; } if (Name != nameConvention.GetExtensionBuilderName(TypeName)) { resolutionResult.AddError("The extension builder name and its type name does not comply with the name convention!"); result = false; } return(result | DoIntrospect(nameConvention, resolutionResult, "extension builder")); }
public AddinConfiguration(IMessageDialog dialog, FileConfiguration fileConfig, INameConvention nameConvention, IExtensionBuilderFactory extensionBuilderFactory, IExtensionPointFactory extensionPointFactory) { _messageDialog = dialog; _fileConfig = fileConfig; _nameConvention = nameConvention; _ebFactory = extensionBuilderFactory; _epFactory = extensionPointFactory; }
internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { var result = true; if (TypeName.IsNullOrWhiteSpace()) { resolutionResult.AddError("An extension point must at least provide a type name!"); result = false; } return(result | DoIntrospect(nameConvention, resolutionResult, "extension point")); }
internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { var result = true; if (ExtensionPointName == null) { resolutionResult.AddError("An id of extension point must have an parent!"); result = false; } if (ParentPath == null) { resolutionResult.AddError("An extension builder must have an parent!"); result = false; } return(result | DoIntrospect(nameConvention, resolutionResult, "extension builder")); }
internal AddinFramework(AddinOptions options) { _repository = new AddinRepository(); _messageDialog = options.MessageDialog ?? new DefaultMessageDialog(); _nameConvention = options.NameConvention ?? new DefaultNameConvention(); _fileSettings = options.FileSettings ?? new AddinFileSettings(); _assemblyLoadPolicy = options.AssemblyLoadPolicy ?? new DefaultAssemblyLoadPolicy(); _ebFactory = options.ExtensionBuilderFactory ?? new ReflectionExtensionBuilderFactory(); _epFactory = options.ExtensionPointFactory ?? new ReflectionExtensionPointFactory(); _eventBroker = options.EventBroker ?? new EventBroker(new EventBrokerOption()); _serviceProvider = options.ServiceProvider ?? new DefaultServiceProvider(); _stringLocalizer = options.StringLocalizer ?? new DefaultStringLocalizer(); LogManager.Initialize(new FileLogSetting(_fileSettings.DataDirectory, AddinFileSettings.LogFileName)); _logger = LogManager.GetDefaultLogger(); _properties = new Dictionary <HashKey, object>(); }
internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { var result = true; if (AddinHeader == null) { resolutionResult.AddError( string.Format("The addin located at [{0}] does not define any addin properties (name, guid, etc) in the Addin node of manifest file, which is required!", ManifestFile.Directory)); result = false; } else { result &= AddinHeader.Introspect(ManifestFile.Directory, resolutionResult); } if (!result) { return(false); } if (AddinActivator != null) { result &= AddinActivator.Introspect(resolutionResult); } if (ExtensionSchema == null && Extensions == null) { resolutionResult.AddError(string.Format( "A valid addin manifest file must contain either an extension schema node, or an extension node, or both, while the addin [{0}] located at [{1}] does not provide any of them!", AddinHeader.Name, ManifestFile.Directory)); result = false; } if (ExtensionSchema != null) { result &= ExtensionSchema.Introspect(nameConvention, resolutionResult); } if (Extensions != null) { result &= Extensions.Introspect(resolutionResult); } return(result); }
internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { var result = true; if (_eps != null) { foreach (var ep in _eps) { result &= ep.Introspect(nameConvention, resolutionResult); } } if (_ebGroups != null) { foreach (var ebGroup in _ebGroups) { result &= ebGroup.Introspect(nameConvention, resolutionResult); } } return(result); }
internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult) { if (ParentPath == null) { resolutionResult.AddError(""); return(false); } if (_children == null) { resolutionResult.AddError(""); return(false); } foreach (var child in _children) { if (!child.Introspect(nameConvention, resolutionResult)) { return(false); } } return(true); }
// @return value: whether the persistence file has been updated. public ResolutionResult Resolve(INameConvention nameConvention, AddinFileSettings fileSettings, AssemblyLoadPolicy assemblyLoadPolicy, AddinStorage addinStorage, AddinRelationManager relationManager, ScanFilePackResult scanFilePackResult) { var ctx = new ResolutionContext(); var cm = new ConvertionManager(); InitializeDataTransformers(ctx, cm); if (assemblyLoadPolicy.PrivateAssemblyProbingDirectories != null) { foreach (var privateAssemblyProbingDirectory in assemblyLoadPolicy.PrivateAssemblyProbingDirectories) { AssemblyResolution.AddSearchDirectory(privateAssemblyProbingDirectory); } } var resolver = new DefaultAddinResolver(addinStorage, relationManager, cm); // 强制 ExtensionBuilder 节点应用 NameConvention return(resolver.Resolve(nameConvention, ctx, scanFilePackResult)); }
protected bool DoIntrospect(INameConvention nameConvention, ResolutionResult resolutionResult, string name) { var result = true; if (Name.IsNullOrWhiteSpace()) { resolutionResult.AddError("An " + name + " must at least have an name to be identified!"); result = false; } if (Name.Contains(SysConstants.PathSeparatorString)) { resolutionResult.AddError("An " + name + " name can not contain [/]!"); result = false; } if (_children != null) { foreach (var child in _children) { result &= child.Introspect(nameConvention, resolutionResult); } } return(result); }
internal abstract bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult);
internal abstract ResolutionResult Resolve(INameConvention nameConvention, ResolutionContext ctx, ScanFilePackResult scanFilePackResult);
public AddinConfiguration(FileConfiguration fileConfig, INameConvention nameConvention) : this(new ConsoleMessageDialog(), fileConfig, nameConvention, new ReflectionExtensionBuilderFactory(), new ReflectionExtensionPointFactory()) { }
internal override ResolutionResult Resolve(INameConvention nameConvention, ResolutionContext ctx, ScanFilePackResult scanFilePackResult) { var resolutionResult = new ResolutionResult(); // try parsing the new (or updated) addin manifests (configuration) var adnResolutions = TryParseAddins(nameConvention, resolutionResult, scanFilePackResult.ScanFilePacks); if (adnResolutions == null) { resolutionResult.NewAddinsFound = false; return(resolutionResult); } var addinCollision = new AddinCollision(); // try to register id of new addins at first, so that we can tell whether there are // any updated addins when registering that of the existing addins. foreach (var adnResolution in adnResolutions) { TryRegisterAddin(resolutionResult, ctx, adnResolution, addinCollision); } // register all assets of existing addins to the context (skipping updated addins) List <AddinResolution> resolableAddins = null; if (AddinStorage.AddinRecordCount > 0) { resolableAddins = RegisterExistingAssets(resolutionResult, ctx, addinCollision); } // try to register assets of new and updated addins to the context foreach (var adnResolution in adnResolutions) { TryRegisterAssets(resolutionResult, ctx, adnResolution, addinCollision); } if (resolableAddins != null) { adnResolutions.AddRange(resolableAddins); } // tries to resolve all addin, and make sure: // 1. there is no cirular dependencies between the resolved addins. // 2. the resolved addin list is sorted by the dependency. var resolvedAddins = TryResolveAddins(resolutionResult, ConvertionManager, ctx, adnResolutions); if (adnResolutions.Count > 0) { StoreUnresolvableAddins(adnResolutions); // 剩余的 adnResolutions 即为未成功解析的插件,此处也要将它们持久化 } if (ResolutionFailed(resolutionResult, ctx, resolvedAddins)) { resolutionResult.NewAddinsFound = false; return(resolutionResult); } // if there is any conflicting addins, trim them and all addins that depends on them. if (addinCollision.Count > 0) { TrimConflictingAddins(addinCollision, resolvedAddins); // recursively if (ResolutionFailed(resolutionResult, ctx, resolvedAddins)) { resolutionResult.NewAddinsFound = false; return(resolutionResult); } } // save all resolvable addin records to persistent file. StoreResolvedAddins(resolutionResult, ctx, resolvedAddins); PersistAddinStorage(resolutionResult); ctx.Dispose(); resolutionResult.NewAddinsFound = true; return(resolutionResult); }
public AddinOptions WithNameConvention(INameConvention nameConvention) { _nameConvention = nameConvention; return(this); }