фона:Как передать значение времени выполнения параметру конструктора при регистрации типа?
У меня есть много классов по имени XxxService, где один из параметров конструктора является UserId, как
public XxxService: IXxxService
{
public XxxService(string userId, IMmmService mmm, INnnService nnn) {....}
}
идента исходит от HttpContext.Current.Request.Cookies. Число классов обслуживания огромно, поэтому я не хочу создавать интерфейс IIdProvider для каждого класса обслуживания.
Я знаю, что при регистрации могу передать значение времени компиляции конструктору.
container.RegisterType<IService, Service>
(new InjectionConstructor(5, //<-- compile time value
container.Resolve<IMmmService>(),
container.Resolve<INnnService>()));
Как передать функцию конструктору? Что-то вроде:
container.RegisterType<IService, Service>
(new InjectionConstructor(()=>GetIdFromRequest(), //<--- runtime value
container.Resolve<IMmmService>(),
container.Resolve<INnnService>()))
Я также знаю, что есть InjectionFactory
container.RegisterType<IService, Service>
(new InjectionFactory(
(x)=> new Service(
GetIdFromRequest(),
container.Resolve<IMmmService>(),
container.Resolve<INnnService>()))
Но это нужно решать другие параметры вручную.
Есть ли лучший способ сделать это? Я просто хочу передать значение времени выполнения одному из параметров по индексу имени, а другие параметры должны обрабатываться контейнером автоматически.
Так самое, что я хочу что-то вроде:
// fake code
container.RegisterType<IService, Service>
(new InjectedParameter(0, // the first parameter
()=>GetIdFromRequest() // <--- runtime value
)
Можете ли вы показать код, пожалуйста? – Zach
Вы правы, ведь это не так очевидно. Я добавлю полный пример. – cynic
container.RegisterType (новый InjectionFactory (c => c.Resolve (новый параметр ParameterOverride («Userd», GetIdFromRequest())))); выдает исключение StackoverflowException. –
Zach