Structuremap不适用于MVC4

Ara*_*ami 11 structuremap asp.net-mvc inversion-of-control asp.net-mvc-3 asp.net-mvc-4

我已经StructureMap多次使用MVC2/3而没有任何顾虑,但我想在MVC4中处理IoC是不同的.当我用于StructureMap处理MVC4中的IoC时,我得到以下异常:

没有为此对象定义的无参数构造函数

为什么?我没有在谷歌找到任何正确的结果,除了这个: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;
    }
Run Code Online (Sandbox Code Playgroud)

而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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的错误是:

没有为此对象定义的无参数构造函数.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
Run Code Online (Sandbox Code Playgroud)

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[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(Type type,Boolean nonPublic)+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 func)+124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback callback,Object state)+98 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback回调,对象状态)+50 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)+16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8862676 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+1841.<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



谢谢你的正确答案.

Ara*_*ami 9

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

然后将其注册到IoC类:

 x.For<IControllerActivator>().Use<StructureMapControllerActivator>();
Run Code Online (Sandbox Code Playgroud)

然后享受它.祝好运

  • 虽然技术上不需要`IControllerActivator`,但您可能仍然需要一个,至少在开发过程中.为什么?好吧,因为如果你没有和你的DI容器抛出错误,那么MVC会吃错误,并再次使用`Activator.CreateInstance`,这可能会产生如上所述的错误.这使得很难确定出了什么问题.:-( (4认同)
  • Structuremap不需要这样做.有关IControllerActivator扩展点在MVC3 +中的原因,请参阅[此博客](http://www.devtrends.co.uk/blog/do-not-implement-icontrolleractivator-in-asp.net-mvc-3). (3认同)