特定のインターフェイスとしてクラスを登録しようとしていて、明示的なクラスをコンストラクタのパラメータとして使用しようとしています。問題はそれらがすべて私の現在の登録がAutofacの "Circular component dependency detected"で終わる同じインターフェースを実装していることです。ここでAutofacによるネストされた登録
は、私が得たものである:
public interface IWorker
{
void DoWork();
}
public class FirstLineWorker : IWorker
{
public void DoWork()
{
//Do some work
}
}
public class SecondLineWorker : IWorker
{
public void DoWork()
{
//Do some morework
}
}
public class SequentialWorker : IWorker
{
private readonly IList<IWorker> _workers;
public SequentialWorker(params IWorker[] workers)
{
_workers = workers;
}
public void DoWork()
{
foreach (var worker in _workers)
{
worker.DoWork();
}
}
}
はどうAutofacで私はプログラム的に明示的なパラメータFirstLineWorkerとSecondLineWorkerでSequentialWorkerとしてIWorkerを登録することができますか?
た円形reigstrationで終わった初の試み:
var builder = new ContainerBuilder();
builder
.RegisterType<FirstLineWorker>()
.Named<IWorker>(typeof(FirstLineWorker).Name)
.InstancePerDependency();
builder
.RegisterType<SecondLineWorker>()
.Named<IWorker>(typeof(SecondLineWorker).Name)
.InstancePerDependency();
builder.RegisterType<SequentialWorker>()
.As<IWorker>()
.WithParameter(ResolvedParameter.ForNamed<IWorker>(typeof(FirstLineWorker).Name))
.WithParameter(ResolvedParameter.ForNamed<IWorker>(typeof(SecondLineWorker).Name))
.InstancePerDependency();
任意のアイデア?
を解決するときに
ToArray()
を実行する必要性を回避して、あなたはIEnumerable
を使用することができます - それは、よりクリーンで読みやすいです。また、実際には、Worker1とWorker2の役割は、同じインタフェースを使用している場合でも、SequentialWorkerとは異なります – tdragon