Поскольку Class1
предоставляет данные (ссылку на себя) на 'IFooService`, вы должны ввести фабричный делегат , который принимает эти данные.Рассмотрим следующий код:
class Class1 : ISomeInterface
{
private readonly IFooService _service;
public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
{
_service = fooServiceFactory(this);
.....
}
}
Теперь регистрация идет просто так:
var builder = new ContainerBuilder();
builder.RegisterType<Class1>().As<ISomeInterface>();
builder.RegisterType<FooService>().As<IFooService>();
var container = builder.Build();
var something = container.Resolve<ISomeInterface>();
Autofac автоматически разрешит тип Func<..>
в соответствии с типом IFooService
иISomeInterface
параметр конструктора.
Обновление: связано с продолжающимся обсуждением в комментариях.Отделение SomeMethod
от реализации ISomeInterface
:
// Class1 is now oblivious to IFooService
class Class1 : ISomeInterface
{
public Class1()
{
}
}
// Class2 now holds the SomeMethod logic
class Class2 : ISomeOtherInterface
{
private readonly IFooService _fooService;
public Class2(IFooService fooService)
{
_fooService = fooService;
}
public void SomeMethod()
{
// do something with _fooService
}
}
Если SomeMethod
не может быть отделено от Class1
, я все равно пошел бы на заводскую альтернативу.Вот небольшая модификация, которая приводит к тому, что IFooService
не будет разрешен до тех пор, пока не потребуется, то есть когда вызывается SomeMethod
.
class Class1 : ISomeInterface
{
private readonly Func<ISomeInterface, IFooService> _fooServiceFactory;
public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
{
_fooServiceFactory = fooServiceFactory;
}
void SomeMethod()
{
var fooService = _fooServiceFactory(this);
....
}
}
Опять блеск заводских черт Autofac.Для работы делегата Func<ISomeInterface, IFooService>
дополнительные регистрации не требуются.