StructureMap не работает на MVC4

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

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

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

public static class IoC {
    public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                        {
                            //scan.Assembly("DLL.Core");
                            scan.Assembly("DLL.CMS");
                            scan.TheCallingAssembly();
                            scan.WithDefaultConventions();
                        });
                        x.For<IDbContext>().Use<ModelEntities>();
                        x.For(typeof(IRepository<>)).Use(typeof(Repository<>));
                        x.For<IHttpControllerActivator>();
                        x.For<IController>();
                    });

        return ObjectFactory.Container;
    }

И 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(Тип типа, Boolean nonPublic) +69
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Тип controllerType) +67

[InvalidOperationException: ошибка при попытке создать контроллер типа 'Parsian.Web.Areas.Dashboard.Controllers.MemberController. Убедиться что контроллер имеет безкоммертный публичный конструктор.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Тип controllerType) +182
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Тип controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController & контроллер, 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
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func
1 func) +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, Boolean и завершен синхронно) +184

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

Ответ 1

ooops.I нашел аварийное решение:) Попробуйте реализовать класс из 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>();

а затем наслаждайтесь им. Удачи.

Ответ 2

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

Ответ 3

попробуйте добавить этот класс как ваш 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;
        }
    }
}

Ответ 4

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

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