Я использую 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));
Если это решение, что произойдет, если тип вложен глубже? Не Что, по крайней мере, частично нарушает цель внедрения зависимостей?