bugfix> c# > 投稿

同じインターフェイスの複数の実装に依存するコードの部分と、実装の1つに依存する他の部分があります。

私は次のような実装を登録しています:

services.AddSingleton<MyInterface, FirstImplementation>();
services.AddSingleton<MyInterface, SecondImplementation>();

次に、必要なときに両方の実装を取得します

var implementations= serviceProvider.GetServices<MyInterface>();

私の問題は、それらのいずれかが必要なときに、nullを返す次のものを試しています:

var firstImplementation= serviceProvider.GetService<FirstImplementation>();

もちろん使用できます:

var implementations= serviceProvider.GetServices<MyInterface>();
foreach (var implementation in implementations)
{
    if (typeof(FirstImplementation) == implementation.GetType())
    {
        FirstImplementation firstImplementation = (FirstImplementation)implementation;
    }
}

しかし、私は私の FirstImplementation を得ることができると考えています なんとなく直接。

回答 3 件
  • コンテナは FirstImplementation を解決する方法を知っています   MyInterface を求められたとき 、 FirstImplementation を解決する方法が伝えられていない  特に FirstImplementation を求められたとき 。

    組み込みのサービスコンテナは、フレームワークとその上に構築されたほとんどのコンシューマアプリケーションの基本的なニーズに応えることを目的としています。必要最低限​​の機能であり、必要に応じて動作するように明示的に設定する必要があります。実装を明示的に要求された場合、実装を取得する方法も伝える必要があります。

    //register implementations first
    services.AddSingleton<FirstImplementation>();
    services.AddSingleton<SecondImplementation>();
    //register interfaces using factory that return implementation singleton
    services.AddSingleton<MyInterface, FirstImplementation>(p => p.GetService<FirstImplementation>());
    services.AddSingleton<MyInterface, SecondImplementation>(p => p.GetService<SecondImplementation>());
    
    

    だから今、あなたはあなたの FirstImplementation を得ることができます  直接、同じインスタンスを取得する

    var firstImplementation = serviceProvider.GetService<FirstImplementation>();
    
    

  • 実際にあなたがしたことは良い習慣ではありません、あなたは2つの異なるを作成することができますインターフェース 基本インターフェースから継承された(MyInterface)そして、適切なインターフェイスに対応する各実装を登録します。その後、特定の実装が必要なコードの部分で、IoCに依頼して、重要なインターフェイスの特定の実装を返します。

    実装
    public interface IFirstImplementation:MyInterface {}
    public interface ISecondImplementation:MyInterface {}
    
    
    登録
    services.AddTransient<IFirstImplementation, FirstImplementation>();
    services.AddTransient<ISecondImplementation, SecondImplementation>();
    
    
    使用法
    var firstImplementation= serviceProvider.GetService<IFirstImplementation>();
    
    

  • Microsoft.Extensions.Dependencyinjection  依存性注入の基本的なニーズを提供し、他にも IoC container があります  問題を解決できる.NET用のフレームワーク。たとえば、次のようなAutofacの名前付きサービスを使用できます。

    //registration method
    var builder = new ContainerBuilder();
    ...
    builder.RegisterType<FirstImplementation>().Named<MyInterface>("first");
    builder.RegisterType<SecondImplementation>().Named<MyInterface>("second");
    //resolve method
    var firstImplementation = container.ResolveNamed<MyInterface>("first");
    
    

    より複雑なシナリオでは、インデックスと属性による解決をサポートするキー付きサービスを使用できます。

    Autofacを使用する場合は、インスタンススコープにも注意を払う必要があります。

あなたの答え