【问题标题】:dotnet core get a list of loaded assemblies for dependency injectiondotnet core 获取已加载程序集的列表以进行依赖注入
【发布时间】:2017-06-22 19:48:36
【问题描述】:

我正在使用 AutoFac 根据接口实现自动注册依赖项,如下所示:

builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly()).AsImplementedInterfaces();

这对入口程序集很有效,但是所有相关程序集呢?

我想做这样的事情:

IList<Assembly> assemblies = GetLoadedAssemblies();
foreach(var assembly in assemblies)
{
  builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
}

我已经搜索并看到了一堆带有 AssemblyLoadContext 等的 .netcore 1.0 内容,但在 1.1 中似乎不再存在。基本上,当您进行搜索时,您会得到很多过时的参考资料,这些参考资料不再有效。

必须有一种方法来获取当前加载的程序集。

我该怎么做?

【问题讨论】:

  • 您真的对加载的程序集或应用程序依赖关系图的一部分感兴趣吗?如果您的程序集没有直接引用,则它可能尚未加载,即使它在 csproj 中被指定为依赖项。
  • 在这个特定的应用程序中,加载的应用程序就可以了。不过,在其他应用程序中,我想加载相关程序集并进行映射,因为您是对的,它们可能尚未加载。

标签: c# dependency-injection .net-core


【解决方案1】:

在 .NET Core 2.0 中,很多 API 都是从 .NET Framework 中引入的,其中有AppDomain.CurrentDomain.GetAssemblies(),它允许您获取已经加载到应用程序域执行上下文中的程序集。当然,这一概念并未完全从 .NET Framework 移植到 .NET Core,因此您无法创建自己的应用程序域并将它们视为单个进程内的隔离单元(因此您只有一个应用程序域)。但这对于您想要实现的目标来说已经足够了。

【讨论】:

    【解决方案2】:

    您可以使用与 .netstandard 1.6 配合使用的 Scrutor,或者看看他们是如何做到的 here.

        public IImplementationTypeSelector FromAssemblyDependencies(Assembly assembly)
        {
            Preconditions.NotNull(assembly, nameof(assembly));
    
            var assemblies = new List<Assembly> { assembly };
    
            try
            {
                var dependencyNames = assembly.GetReferencedAssemblies();
    
                foreach (var dependencyName in dependencyNames)
                {
                    try
                    {
                        // Try to load the referenced assembly...
                        assemblies.Add(Assembly.Load(dependencyName));
                    }
                    catch
                    {
                        // Failed to load assembly. Skip it.
                    }
                }
    
                return InternalFromAssemblies(assemblies);
            }
            catch
            {
                return InternalFromAssemblies(assemblies);
            }
       }
    

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 2020-11-30
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2015-05-30
      • 2020-12-20
      相关资源
      最近更新 更多