2017-07-06 10 views
0

同じソリューション内の別のプロジェクトからクラス名を継承取得私は私が好きにしたい、同じインターフェイスからAsp.NetコアV1.1は、

public class CollectorA : ICollector 
{ 
    public string CollectSomething() 
    { 
     //DO Something 
    } 
} 
public class CollectorB : ICollector 
{ 
    public string CollectSomething() 
    { 
     //DO Something 
    } 
} 

を継承し、このクラス名を取得したい異なる継承したクラスでの作業は:m

public void Init(IServiceCollection serviceCollection) 
{ 

    var types = AppDomain.CurrentDomain.GetAssemblies() 
          .SelectMany(assembly => assembly.GetTypes()) 
          .Where(type => type.IsInstanceOfType(typeof(ICollector))); 

私はAppContextを試しましたが、まだ動作しません。

foreach(var item in types) 
{ 
    serviceCollection.AddTransient<ICollector,item.Name>(); 
} 

答えて

2

あなたはまた、また種類を探している中で、この

foreach(var item in types) 
{ 
    serviceCollection.AddTransient(typeof(ICollector), item); 
} 

ようにそれを追加することができ、次を試してみてください。

//get collectors 
var types = typeof(CollectorA).Assembly 
    .GetTypes() 
    .Where(t => typeof(ICollector).IsAssignableFrom(t)); 

//add to service 
foreach(var item in types) 
{ 
    serviceCollection.AddTransient(typeof(ICollector), item); 
} 
+0

種類の値はnullです。 – Batuhan

+0

@Batuhan、Ok、それを見てみましょう。これはどんなタイプのプロジェクトです。 – Nkosi

+0

クラスライブラリ(ASP.NET-Core) - コンソールアプリケーションからこのプロセスを実行しています。 – Batuhan

0

.NETのコアにはAppDomainはありませんので、この AppDomain.CurrentDomain.GetAssemblies()はそこにも( .NET標準1.xのは、それを持っているのどれも。)ではないではありません。ここ これを詳述GitHubのissueです。

あなたはblogにポリフィル(アプリケーションドメイン)のアプローチに行きたい場合は、ここでのコードに

public class AppDomain 
{ 
    public static AppDomain CurrentDomain { get; private set; } 

    static AppDomain() 
    { 
     CurrentDomain = new AppDomain(); 
    } 

    public Assembly[] GetAssemblies() 
    { 
     var assemblies = new List<Assembly>(); 
     var dependencies = DependencyContext.Default.RuntimeLibraries; 
     foreach (var library in dependencies) 
     { 
      if (IsCandidateCompilationLibrary(library)) 
      { 
       var assembly = Assembly.Load(new AssemblyName(library.Name)); 
       assemblies.Add(assembly); 
      } 
     } 
     return assemblies.ToArray(); 
    } 

    private static bool IsCandidateCompilationLibrary(RuntimeLibrary compilationLibrary) 
    { 
     return compilationLibrary.Name == ("Specify") 
      || compilationLibrary.Dependencies.Any(d => d.Name.StartsWith("Specify")); 
    } 
} 

をだ。そしてあなたにはこの

var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(ass => ass.ExportedTypes) 
          .Where(type => type.IsInstanceOfType(typeof(ICollector))); 
      foreach (var item in types) 
      { 
       services.AddTransient(typeof(ICollector), item); 
      } 

のように使用することができます代わりの方法はGetAssemblies()またはタイプの代替品を入手するにはSO postを参照してください。