2017-06-22 67 views
4

我使用AutoFac根据自己的接口实现像这样自动注册的依赖关系:DOTNET核心得到加载的程序集列表依赖注入

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

这对于入门组装的伟大工程,但对于所有相关程序集?

我想这样做:

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

我已经搜查,看到一堆.netcore 1.0的东西与AssemblyLoadContext等等,但似乎不再在1.1存在。基本上,当你搜索时,你会得到很多过时的引用,这些引用不再适用。

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

我该怎么做?

+0

您在加载组件或应用程序的依赖关系图的那些部分真正感兴趣的?如果程序集没有直接引用它,它可能尚未加载,即使它在csproj中指定为依赖项。 –

+0

在这个特定的应用程序,加载的人会做。但是,在其他应用程序中,我想加载相关的程序集并进行映射,因为您是对的,它们可能尚未加载。 – Robert

回答

2

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

0

您可以使用Scrutor这正与.netstandard 1.6或者看看他们是如何做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); 
     } 
    }