ASP.NET MVC 2 Предварительный просмотр 1 - Составление задачи StructureMap Controller Factory
У меня есть проект, для которого я использую StructureMap для инъекции зависимостей. Проект компилируется как проект MVC, но после переноса всего на проект MVC2 я получаю следующую ошибку:
Test.Web.Controllers.StructureMapControllerFactory.GetControllerInstance(System.Type) ': нет подходящего метода для переопределить C:\Test\Web\Controllers\StructureMapControllerFactory.cs 11 40 Test.Web
Вот мой StructureMapControllerFactory:
using System;
using System.Web.Mvc;
using StructureMap;
namespace Test.Web.Controllers
{
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)**
{
IController result = null;
try
{
if (controllerType == null) return base.GetControllerInstance(controllerType);
result = ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException)
{
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
return result;
}
}
}
Я нашел одно сообщение, связанное с этим вопросом, но не предлагало понять, как решить мою проблему: MVC 2 preview 1 - методы с параметрами в контроллере не загружается
Очевидно, что я должен упускать изменения из прогрессии 1.0-2.0, но я не уверен, что изменилось. Любая помощь всегда приветствуется.
Ответы
Ответ 1
Подпись этого метода изменилась. Теперь есть первый аргумент RequestContext:
protected override IController GetControllerInstance(
RequestContext requestContext,
Type controllerType)
Вам также необходимо изменить свой вызов на base.GetControllerInstance:
if (controllerType == null)
return base.GetControllerInstance(requestContext, controllerType);
Ответ 2
Крейг Сунтц здесь очень прав.
Просто убедитесь, что вы не забыли ссылаться на System.Web.Routing, если ваш DI находится в другом проекте, чем у приложения MVC.
По какой-то причине в IDE для меня не было ошибок, но при компиляции я все равно получаю GetControllerInstance. "Не найдено подходящего метода для переопределения".
Как только я исправил недостающую ссылку на сборку System.Web.Routing, все было хорошо...
Ответ 3
Я проследил его с помощью Reflector, и действительно, подпись функции изменяется.
защищенный внутренний виртуальный IController GetControllerInstance (RequestContext requestContext, Type controllerType)
здесь находится MVC 2 dll:
C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll
Спасибо, он решил мою проблему!