Asp.net mvc 3 带控制器默认构造函数的autofac mvc3,需要帮助吗?

Asp.net mvc 3 带控制器默认构造函数的autofac mvc3,需要帮助吗?,asp.net-mvc-3,dependency-injection,autofac,Asp.net Mvc 3,Dependency Injection,Autofac,我试图模仿使用autofac给出的示例,但我的控制器始终没有出现无参数构造函数丢失错误。我做错了什么?我应该为irepository创建一个modelbinder吗 下面是引导程序的样子。模拟测试人员放在这里,就像在示例中一样,并没有真正反映实际意图。有一个单独的测试项目 Mock<iproductrepository> mock = new Mock<iproductrepository>(); mock.Setup(m => m.products).Return

我试图模仿使用autofac给出的示例,但我的控制器始终没有出现无参数构造函数丢失错误。我做错了什么?我应该为irepository创建一个modelbinder吗

下面是引导程序的样子。模拟测试人员放在这里,就像在示例中一样,并没有真正反映实际意图。有一个单独的测试项目

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);
    }

}
获取此错误

没有为此对象定义无参数构造函数。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源。例外情况详情: System.MissingMethodException:未定义无参数构造函数 对于这个对象。源错误:生成了未处理的异常 在执行当前web请求期间。关于 可以使用 下面是异常堆栈跟踪。堆栈跟踪:[MissingMethodException:否 为此对象定义的无参数构造函数。] System.RuntimeTypeHandle.CreateInstanceRuntimeType类型,布尔值 publicOnly、Boolean noCheck、Boolean&canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck+0 System.RuntimeType.CreateInstanceSlowBoolean publicOnly,布尔型 skipCheckThis,布尔填充缓存+98 System.RuntimeType.CreateInstanceDefaultTorBoolean publicOnly, 布尔skipVisibilityChecks,布尔skipCheckThis,布尔 fillCache+241 System.Activator.CreateInstanceType类型,布尔值 非公开+69 System.Web.Mvc.DefaultControllerActivator.CreateRequestContext requestContext,类型控制器Type+67[无效操作异常: 尝试创建类型为的控制器时出错 “*.productcontroller”。请确保控制器具有

method builder.RegisterControllers中的Autofac注册以大写字母C结尾的控制器:

...
if (typeof (IController).IsAssignableFrom(t))
   return t.Name.EndsWith("Controller");
else
   return false;
...
因此,您仍然需要在C productController中根据将控制器重命名为productController,或者在容器中手动注册控制器。

方法生成器中的Autofac。RegisterController注册以大写字母C结尾的控制器:

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

因此,在C productController中,您需要根据指定的名称将控制器重命名为productController,或者在容器中手动注册控制器。

这是一个很好的实例,说明了为什么您应该尽可能遵守标准命名约定。天哪!谢谢bunch。我不知道这些标准会被强制执行.哇,这太令人沮丧了。控制器名称中的拼写错误。这不是命名约定的真正教训,而是忽略大小写的教训。这是一个很好的实践例子,说明了为什么你应该尽可能坚持标准命名约定。天哪!谢谢你。我不知道这些标准会被强制执行。哇,这太令人沮丧了。控制器中的拼写错误oller的名字。这并不是命名惯例的课程,而是忽略大小写的课程。