Я понял это благодаря ссылке @Michael Carman, опубликованной в комментарии к его ответу.Я не уверен в этикете здесь о том, оправдывает ли тот факт, что он принимает его фактический ответ, так как это было не совсем правильно (я дал ему +1 голос), но я решил опубликовать свой собственный ответ, чтобы объяснить, что именнопроблема была.
Проблема была в комбинации моей реализации IDependencyResolver и моей конфигурации контейнера.Изначально у меня было:
public class StructureMapDependencyResolver : IDependencyResolver
{
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
foreach (object obj in ObjectFactory.GetAllInstances(serviceType))
{
yield return obj;
}
}
}
, но теперь я изменил это на основе сообщения в блоге Стива Смита , на которое ссылается сообщение в блоге Джереми Миллера :
public class StructureMapDependencyResolver : IDependencyResolver
{
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
{
return ObjectFactory.TryGetInstance(serviceType);
}
else
{
return ObjectFactory.GetInstance(serviceType);
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
foreach (object obj in ObjectFactory.GetAllInstances(serviceType))
{
yield return obj;
}
}
}
само по себе это не решит проблему, пока я не удалю это выражение конфигурации:
x.For<IControllerFactory>().Use<DefaultControllerFactory>();
В соответствии с документацией TryGetInstance возвращает только типы, зарегистрированные в контейнере, и возвращает null, если их нетсуществовать.Я предполагаю, что код MVC 3 полагается на это поведение, чтобы указать, что он должен использовать свои значения по умолчанию, поэтому в моем исходном случае мне пришлось зарегистрировать эти значения по умолчанию в моем контейнере.Хитрый!