2017-06-22 66 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); 
     } 
    }