autofac mvc3与控制器默认构造函数,需要帮助?

时间:2011-11-21 12:19:27

标签: asp.net-mvc-3 dependency-injection autofac

我试图模仿使用autofac给出的样本,但我的控制器不断地没有得到无参数构造函数的错误。如果我为irepository创建一个模型绑定器,我该怎么做?

这是引导程序的样子。嘲笑的测试者放在这里就像在例子中并没有真正反映实际意图。那将是一个单独的测试项目。

Mock<iproductrepository> mock = new Mock<iproductrepository>();
mock.Setup(m => m.products).Returns(new List<product>()
                                        {
                                            new product() {name = "football", price = 25},
                                            new product() {name = "surf board",price = 179},
                                            new product() {name = "running shoes", price = 95}
                                        }.AsQueryable()

    );

builder.RegisterInstance(mock.Object).As<iproductrepository>();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterControllers(Assembly.GetExecutingAssembly());


var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

这里是控制器简单

public class productcontroller : Controller
{
    private readonly iproductrepository _productrepository;


    /// <summary>
    /// 
    /// </summary>
    /// <param name="productrepository"></param>
    public productcontroller(iproductrepository productrepository)
    {
        _productrepository = productrepository;
    }

    //
    // GET: /product.controller/

    public ViewResult list()
    {
        return View(_productrepository.products);
    }

}

收到此错误

  

没有为此对象定义无参数构造函数。描述:一个   在执行当前Web期间发生了未处理的异常   请求。请查看堆栈跟踪以获取有关的更多信息   错误以及它在代码中的起源。例外细节:   System.MissingMethodException:未定义无参数构造函数   对于这个对象。源错误:生成了未处理的异常   在执行当前Web请求期间。有关的信息   可以使用。来识别异常的起源和位置   下面的异常堆栈跟踪。堆栈跟踪:[MissingMethodException:No   为此对象定义的无参数构造函数。]
  System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值   publicOnly,Boolean noCheck,Boolean&amp; canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔&amp; 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:   尝试创建类型的控制器时发生错误   '* .productcontroller'。确保控制器有

1 个答案:

答案 0 :(得分:5)

方法builder.RegisterControllers中的Autofac将名称以“Controller”结尾的控制器注册为大写C:

...
if (typeof (IController).IsAssignableFrom(t))
   return t.Name.EndsWith("Controller");
else
   return false;
...

因此,您需要将控制器重命名为productController(无论如何根据naming convenctions在C#ProductController中),或者在容器中“手动”注册您的控制器。