Я пытаюсь зарегистрировать класс как определенный интерфейс и использовать явные классы в качестве параметров его конструктора. Проблема в том, что все они реализуют тот же интерфейс, который с моей текущей регистрацией заканчивается в Autofac «Обнаружена зависимость циклического компонента».Вложенная регистрация с 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 программно зарегистрировать SequentialWorker в IWorker с явными параметрами FirstLineWorker и SecondLineWorker?
Первая попытка, которая закончилась в круговом 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();
Любые идеи?
ИМХО первый подход лучше - чище и более удобным для чтения. Кроме того, на самом деле роль Worker1 и Worker2 слабее, чем SequentialWorker, даже если они имеют один и тот же интерфейс – tdragon