在MVC中映射对象时使用unity的错误

时间:2014-11-04 20:37:31

标签: c# asp.net-mvc asp.net-mvc-4 c#-4.0 unity-container

我在控制器构造函数中使用unity时遇到了问题。以下是详细信息 -

在单位配置(unity.config)中 - 这就是我正在做的事情 -

container.RegisterType<ISessionWrapper, SessionWrapper>()

在Controller构造函数

    public OnboardingController( ISessionWrapper sessionwrapper )
    {
        SessionWrapper = sessionwrapper;
    }

SessionWrapper

公共接口ISessionWrapper     {         string Brand {get;组; }         // string CurrenSessionCulture {get;组; }     }

public class SessionWrapper : ISessionWrapper
{
    public string Brand
    {
        get;
        set;
    }
}

执行此操作时出错

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

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

当我像这样更改Controller Constructor定义时,它一切正常。

    public OnboardingController()
        : this(new SessionWrapper())
    {
        //
    }

1 个答案:

答案 0 :(得分:0)

您需要使用Unity自定义ControllerFactory来解析控制器类的实例。 MVC使用的默认ControllerFactory要求控制器类具有无参数构造函数。

使用Unity的自定义ControllerFactory看起来像

public class UnityControllerFactory : DefaultControllerFactory {
  private readonly IUnityContainer _container;

  public UnityControllerFactory (IUnityContainer container) {
    _container = container;
  }

  protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
    if (controllerType != null) {
        return _container.Resolve(controllerType) as IController;
    }
    else {
        return base.GetControllerInstance(requestContext, controllerType);
    }
  }
}

在应用程序启动时(通常在global.asax中),您可以使用以下代码在MVC运行时中注册ControllerFactory

var container = // initialize your unity container
var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);