Я использую Autofac в качестве IoC в своем сервисе WCF. У меня есть ситуация, когда я хочу передать объект вложенному типу (то есть типу, который не разрешен напрямую, но при разрешении другого типа). Насколько я понял, передача этого объекта в качестве параметра конструктора является предпочтительным способом в Autofac. Вот пример такой ситуации.
Вложенный тип:
public class EventLogger<T> : IEventLogger<T>
{
public EventLogger(IRepository<T> repository, User currentUser) { ... }
}
Тип, который я на самом деле пытаюсь определить:
public class SomeBusinessObject
{
public SomeBusinessObject(IEventLogger<SomeLogEventType> logger, ...) { ... }
}
Регистрация:
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterGeneric(typeof(EventLogger<>)).As(typeof(IEventLogger<>));
builder.RegisterType<SomeBusinessObject>();
Разрешение внутри моей службы WCF:
var currentUser = GetUserFromServiceContext();
var bo = lifetimeScope.Resolve<SomeBusinessObject>();
Как и где мне передать текущего пользователя моему логгеру? Должен ли я предполагать, что операция WCF должна знать, что для разрешения SomeBusinessObject необходимо сначала разрешить IEventLogger и передать разрешенный экземпляр при разрешении SomeBusinessObject? Как то так (простите, если это не работает, это просто идея):
var currentUser = GetUserFromServiceContext();
var logger = lifetimeScope.Resolve<IEventLogger<SomeLogEventType>>(new NamedParameter("currentUser", currentUser));
var bo = lifetimeScope.Resolve<SomeBusinessObject>(new NamedParameter("logger", logger));
Если это решение, что произойдет, если тип будет вложен глубже? Разве это не разрушает хотя бы какую-то цель внедрения зависимости?