正文

.NET?Core?Web?APi类库内嵌运行的方法(.net core 类库之间的依赖)没想到

文章摘要

本文描述了一个C#类,该类通过配置在`ApplicationPartManager`中的`IApplicationFeatureProvider`实例来填充指定特征。`PopulateFeature`方法遍历所有配置的提供器,将特征应用到指定的应用部分。`PopulateDefaultParts`方法从指定的assemblyName加载assembly,并通过`ApplicationPartAttribute`获取依赖项,将这些应用部分添加到`ApplicationParts`集合中。代码涉及多处依赖项管理,用于确保依赖关系的正确性。

/// <summary> /// Populates the given <paramref name=”feature”/> using the list of /// <see cref=”IApplicationFeatureProvider{TFeature}”/>s configured on the /// <see cref=”ApplicationPartManager”/>. /// </summary> /// <typeparam name=”TFeature”>The type of the feature.</typeparam> /// <param name=”feature”>The feature instance to populate.</param> public void PopulateFeature<TFeature>(TFeature feature) { if (feature==null) { throw new ArgumentNullException(nameof(feature)); } foreach (var provider in FeatureProviders.OfType<IApplicationFeatureProvider<TFeature>>()) { provider.PopulateFeature(ApplicationParts, feature); } } internal void PopulateDefaultParts(string entryAssemblyName) { var assemblies=GetApplicationPartAssemblies(entryAssemblyName); var seenAssemblies=new HashSet<Assembly>(); foreach (var assembly in assemblies) { if (!seenAssemblies.Add(assembly)) { // “assemblies” may contain duplicate values, but we want unique ApplicationPart instances. // Note that we prefer using a HashSet over Distinct since the latter isn’t // guaranteed to preserve the original ordering. continue; } var partFactory=ApplicationPartFactory.GetApplicationPartFactory(assembly); foreach (var applicationPart in partFactory.GetApplicationParts(assembly)) { ApplicationParts.Add(applicationPart); } } } private static IEnumerable<Assembly> GetApplicationPartAssemblies(string entryAssemblyName) { var entryAssembly=Assembly.Load(new AssemblyName(entryAssemblyName)); // Use ApplicationPartAttribute to get the closure of direct or transitive dependencies // that reference MVC. var assembliesFromAttributes=entryAssembly.GetCustomAttributes<ApplicationPartAttribute>() .Select(name=> Assembly.Load(name.AssemblyName)) .OrderBy(assembly=> assembly.FullName, StringComparer.Ordinal) .SelectMany(GetAssemblyClosure); // The SDK will not include the entry assembly as an application part. We’ll explicitly list it // and have it appear before all other assemblies \ ApplicationParts. return GetAssemblyClosure(entryAssembly) .Concat(assembliesFromAttributes); } private static IEnumerable<Assembly> GetAssemblyClosure(Assembly assembly) { yield return assembly; var relatedAssemblies=RelatedAssemblyAttribute.GetRelatedAssemblies(assembly, throwOnError: false) .OrderBy(assembly=> assembly.FullName, StringComparer.Ordinal); foreach (var relatedAssembly in relatedAssemblies) { yield return relatedAssembly; } }