Возможно, я что-то пропустил, но приведенный выше ответ не работает для меня (с тех пор был удален - хотя он все еще был полезным - он показал, как сказать SM передавать аргументы конструктора). Вместо этого, если я сделаю:
ObjectFactory.Initialize(x =>
{
x.BuildInstancesOf<HttpContext>()
.TheDefault.Is.ConstructedBy(() => HttpContext.Current);
x.ForRequestedType<IUserProvider>()
.TheDefault.Is.OfConcreteType<HttpContextUserProvider>();
});
Я заставляю его работать. Я сделал это после нахождения: http://codebetter.com/blogs/jeremy.miller/archive/2008/03/20/if-you-need-something-in-structuremap-but-you-can-t-build-it-with-new.aspx
редактирование:
Благодаря ответу Брэда, я думаю У меня есть лучшая ручка для HttpContext. Его ответ определенно работает, я просто не уверен, что мне нравится иметь вызов HttpContext.Current внутри класса (кажется, что он скрывает зависимость, но я далеко не эксперт в этом деле).
Приведенный выше код должен работать для внедрения HttpContext, насколько я могу судить. Мэтт Хинце говорит о том, что, если все, что мне нужно от HttpContext, это User.Identity.Name, мой дизайн должен быть явным об этом (имея интерфейс вокруг HttpContext, показывающий только то, что мне нужно). Я думаю, что это хорошая идея.
Дело за обедом. Я вроде понял, что мой сервис должен зависеть только от строки: userName. Наличие зависимости от IUserProvider может не иметь большой добавленной стоимости. Так что я знаю, что не хочу, чтобы это зависело от HttpContext, и я знаю, что все, что мне нужно, это строка (userName) - мне нужно посмотреть, смогу ли я выучить достаточно StructureMap foo, чтобы установить это соединение для меня. (ответ sirrocoo дает подсказку о том, с чего начать, но он удалил его: * ().