Structuremap не работает на MVC4 - PullRequest
11 голосов
/ 04 марта 2012

Я использовал StructureMap в MVC2 / 3 много раз без каких-либо проблем, но я думаю, что обработка MVC отличается в MVC4 Когда я использовал StructureMap для обработки IoC в MVC4, я получаю следующее исключение.:

Для этого объекта не определен конструктор без параметров

Почему? Я не нашел правильного результата в Google, кроме этого: IoC не работает в MVC4 Это мои классы IoC:

* * 1010

И SmDependencyResolver:

    public class SmDependencyResolver : IDependencyResolver
{
    private readonly IContainer _container;

    public SmDependencyResolver(IContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType == null) return null;
        try
        {
            return serviceType.IsAbstract || serviceType.IsInterface
                     ? _container.TryGetInstance(serviceType)
                     : _container.GetInstance(serviceType);
        }
        catch
        {

            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType).Cast<object>();
    }
}

И моя ошибка:

Для этого объекта не определен конструктор без параметров. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите стек проследить для получения дополнительной информации об ошибке и где она возникла код.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Ошибка источника:

Во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение можно определить с помощью трассировки стека исключений ниже.

Трассировка стека:

[MissingMethodException: для этого не определен конструктор без параметров объект.] System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, Boolean publicOnly, Boolean noCheck, Boolean & canBeCached, RuntimeMethodHandleInternal & ctor, Boolean & bNeedSecurityCheck) + 0
System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) + 98
System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance (тип, логическое значение непубличный) + 69
System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) + 67

[InvalidOperationException: произошла ошибка при попытке создать контроллер типа 'Parsian.Web.Areas.Dashboard.Controllers.MemberController. Удостовериться что контроллер имеет открытый конструктор без параметров.]
System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) + 182
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Type controllerType) + 80
System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) + 74
System.Web.Mvc.MvcHandler.ProcessRequestInit (HttpContextBase httpContext, IController & controller, IControllerFactory & factory) +196 System.Web.Mvc. <> C__DisplayClass6.b__2 () +49 System.Web.Mvc. <> C__DisplayClassb 1.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22<br> System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func 1 функция) +124 System.Web.Mvc.MvcHandler.BeginProcessRequest (HttpContextBase httpContext, обратный вызов AsyncCallback, состояние объекта) + 98
System.Web.Mvc.MvcHandler.BeginProcessRequest (HttpContext httpContext, Обратный вызов AsyncCallback, состояние объекта) + 50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (HttpContext контекст, AsyncCallback cb, Object extraData) + 16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8862676 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершен синхронно) + 184

Спасибо за правильные ответы.

Ответы [ 4 ]

9 голосов
/ 06 марта 2012

ooops. Я нашел экстренное решение :) Попробуйте реализовать класс из IControllerActivator

   public class StructureMapControllerActivator : IControllerActivator
    {
        private IContainer _container;

        public StructureMapControllerActivator(IContainer container)
        {
            _container = container;
        }

        public IController Create(RequestContext requestContext, Type controllerType)
        {
            return _container.GetInstance(controllerType) as IController;
        }
}

и затем зарегистрируйте его в классе IoC:

 x.For<IControllerActivator>().Use<StructureMapControllerActivator>();

и наслаждайся. Удачи

3 голосов
/ 20 октября 2012

Если вы удалите старую конфигурацию для структуры структуры и установите structurmap.mvc4 из nuget , а затем сконфигурируете свой контейнер IoC, у вас не возникнет никаких проблем.

2 голосов
/ 05 марта 2012

попробуйте добавить этот класс в качестве вашей ControllerFactory, на самом деле я видел ошибку выше в MVC3, и это обычно исправляло ее для меня

public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        try
        {
            return (controllerType == null)
                       ? base.GetControllerInstance(requestContext, controllerType)
                       : ObjectFactory.GetInstance(controllerType) as IController;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}
0 голосов
/ 16 марта 2017

Используя StructureMap.MVC5.Update Я должен был сделать это, иначе вложенный IContainer уже был удален (странно):

public class StructureMapControllerActivator : IControllerActivator
{
    public IController Create(RequestContext requestContext, Type controllerType)
    {
        return StructuremapMvc.StructureMapDependencyScope.GetInstance(controllerType) as IController;
    }
}
...