【问题标题】:autofac mvc3 with controller default constructor,need help?带有控制器默认构造函数的 autofac mvc3,需要帮助吗?
【发布时间】:2011-11-21 12:19:26
【问题描述】:

我试图模仿使用 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:否 为此对象定义的无参数构造函数。]
System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,布尔值 publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis,布尔型填充缓存)+98
System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, 布尔型 skipVisibilityChecks,布尔型 skipCheckThis,布尔型 fillCache) +241 System.Activator.CreateInstance(Type type, Boolean 非公开)+69
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,类型控制器类型)+67 [InvalidOperationException: 尝试创建类型控制器时出错 '*.productcontroller'。确保控制器有

【问题讨论】:

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


    【解决方案1】:

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

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

    所以你需要将你的控制器重命名为productController(无论如何在C#中ProductController根据naming convenctions)或者通过“手”在容器中注册你的控制器。

    【讨论】:

    • 一个很好的实际示例,说明为什么您应该尽可能坚持标准命名约定。
    • 天哪!谢谢一堆。不知道这些标准会被强加。
    • 哇,真令人沮丧。输入控制器名称。不是真正的命名约定课程,而是肯定忽略大小写的课程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多