私は、コントローラを作成するために、.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"));
問題、:
ありがとうございます!あなたは私のためにDryIocとのギャップを橋渡しし、デザインを見直すために私をナッジしました...私はそれらを2つのインターフェースに分離する必要が増えてきています。 –