1

私は、コントローラを作成するために、.NET Web API 2サイトでDryIocを使用しようとしています。コントローラにプロセッサが必要で、プロセッサにストレージクラスのインスタンスが2つ必要な状況があります。ここでは基本的である:同じインターフェイスの異なるインスタンスが必要な場合は、どのようにDryIocコンテナをセットアップしますか?

public interface IStorage 
{ 
    IEnumerable<string> List(); 
    void Add(string file); 
    void Remove(string file); 
} 

public class FileSystemStorage : IStorage 
{ 
    // Implement to store on file system. 
} 

public class S3Storage : IStorage 
{ 
    // Implement to store in S3 bucket. 
} 

public interface IProcessor 
{ 
    void Process(); 
} 

public class Processor(IStorage sourceStorage, IStorage targetStorage) 
{ // Implement a process that interacts with both storages } 

public class ProcessController : ApiController 
{ 
    private readonly IProcessor processor; 
    public ProcessController(IProcessor processor) 
    { 
     this.processor = processor; 
    } 
} 

だから、私は私のIOCコンテナ(DryIocが)インターフェイスIStorageのために2つの異なるクラスを使用する必要があります。だから、何私がしたいことは、このような何かのためにセットアップIOCにある:

var sourceStorage = new FileSystemStorage(); 
var targetStorage = new S3Storage(); 
var processor = new Processor(sourceStorage, targetStorage); 
// And then have DryIoc dependency resolver create 
// controller with this processor. 

ただし、登録する通常の方法ではうまく動作しません。

var c = new Container().WithWebApi(config); 

// Need two different implementations... 
c.Register<IStorage, ???>(); 

// And even if I had two instances, how would 
// the processor know which one to use for what parameter? 
c.Register<IProcessor, Processor>(); 

私は注射を依存性の新しいですよコンテナとドキュメントのほとんどは非常に抽象的です。私はそれらをgrokkingしていないよ。これはどうですか?それは、セットアップを中断しますパラメータ名を変更し、脆弱なアプローチ原因があることを

c.Register<IStorage, Foo>(serviceKey: "in"); 
c.Register<IStorage, Bar>(serviceKey: "out"); 
c.Register<IProcessor, Processor>(made: Parameters.Of 
    .Name("source", serviceKey: "in") 
    .Name("target", serviceKey: "out")); 

問題、:

答えて

1

直接的な方法は何が何であるかのプロセッサを異なるキーと異なるストレージ実装の登録を特定し、指示しています。

異なる責任を持つ2つの同一のインターフェイスパラメータを持つ理由を確認し、より適切なabsractions /インターフェイスで役割を区別する必要があります。

+0

ありがとうございます!あなたは私のためにDryIocとのギャップを橋渡しし、デザインを見直すために私をナッジしました...私はそれらを2つのインターフェースに分離する必要が増えてきています。 –

関連する問題