2017-05-18 11 views
0

インタフェースの複数の実装をループする方法はありますか?私はDIフレームワークに基づいて提案を制限したくないので、DIコードの例は書いていません。 Autofac、Ninject、Unityなどがあります。タスクに適しているものは何でも。インタフェースの実装を反復する

私はASP.Netコアを使用していますが、DIの組み込みでは複数の実装ができないと考えています。

したがって、特異なインターフェイスです。

public interface InterfaceA 
{ 
    void MethodA(); 
} 

前記インターフェースを実装し、登録されている多数のクラス。など、この

public TestContoller: Controller 
{ 
    private readonly List<InterfaceA> interfaces; 
    void TestController(List<InterfaceA> interfaces) 
    { 
     this.interfaces = interfaces; 
    } 

    IActionResult TestMethod() 
    { 
     Foreach(var implementation in interfaces) 
     { 
      implementation.MethodA(); 
     } 
     return View(); 
    } 
} 
+1

あなたは同じ質問をされています(http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an-interface)[インターフェースを実装するすべての型を取得]?そうでない場合、どこに問題があるのか​​説明できますか? – Sinatr

+0

私は本当にそのタイプに興味がありません。私が与えたコード例は、私がやりたいことの仮説です。 DIフレームワークが私のように働くことができるかどうかわかりません。私はAutofacを使っているオーチャードCMS(Orchard CMS)のようなものを見たことがあります。だから多分問題は、私の仮説的な例のように働くことを可能にするDIフレームワークですか?もしそうなら、私はどのように私の実装を登録しますか? –

+0

右、私は*「登録されています」のポイントを見逃しています。あなたはコレクションを持っています。なぜあなたはそれを繰り返すことができないのですか?あなたのコードはコンパイルされず、インスタンスを作成していないので、あなたの意図/問題は何か分かりません。私はDIフレームワークを使用していない、おそらくあなたの質問は、1つを知っているときにはっきりしている? – Sinatr

答えて

0

たぶん何かこのような

public class Class1 : InterfaceA 
{ 
    public void MethodA() 
    { 
     //Do something 
    } 
} 

public class Class2 : InterfaceA 
{ 
    public void MethodA() 
    { 
     //Do something 
    } 
} 

コントローラー:

using SimpleInjector; 
using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main (string[] args) 
     { 
      var container = new Container(); 

      container.RegisterCollection<IMyInterface> (new[] { typeof (MyImplementationA), typeof (MyImplementationB) }); 

      var testController = container.GetInstance<TestController>(); 

      testController.TestMethod(); 

      Console.ReadKey(); 
     } 


     public interface IMyInterface 
     { 
      void DoSomething(); 
     } 


     public class MyImplementationA : IMyInterface 
     { 
      public void DoSomething() => Console.WriteLine ("A"); 
     } 


     public class MyImplementationB : IMyInterface 
     { 
      public void DoSomething() => Console.WriteLine ("B"); 
     } 


     public class TestController 
     { 
      private readonly IMyInterface[] instances; 

      public TestController (InstancesFactory<IMyInterface> factory) 
      { 
       instances = factory.GetInstances().ToArray(); 
      } 

      public void TestMethod() 
      { 
       foreach (var instance in instances) 
       { 
        instance.DoSomething(); 
       } 
      } 
     } 


     public class InstancesFactory<T> where T : class 
     { 
      private readonly Container container; 

      public InstancesFactory (Container container) 
      { 
       this.container = container; 
      } 

      public IEnumerable<T> GetInstances() 
      { 
       return container.GetAllInstances<T>(); 
      } 
     } 
    } 
} 

link

+0

私はASP.Net MVCコア実装の後ですが、私が変換できるかどうかはわかります。 –

+0

は、あなたが@Apocalypseを助ける感謝私はあなたの例では動作します確信しているが、変換する最善の方法を確認されませんでした。最後に私は簡単な解決策を見つけました –

0

私は何も特別なことは、私が使用している場合、私は必要なものを行うために必要ありませんがあった実現しましたオートファック。

public IServiceProvider ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddMvc(); 

     var builder = new ContainerBuilder(); 

     // builder.RegisterModule<DataModule>(); 
     builder.RegisterType<Class1>().As<InterfaceA>(); 
     builder.RegisterType<Class2>().As<InterfaceA>(); 

     builder.Populate(services); 

     var container = builder.Build(); 
     return container.Resolve<IServiceProvider>(); 
    } 

空白ではなくIServiceProviderを返すメソッドに変更するだけでした。 (標準コード)

これは私がIEnumerableを私がループすることができたコントローラコンストラクタに渡すことを可能にしました。

関連する問題