我试图模仿使用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'。确保控制器有
答案 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
中),或者在容器中“手动”注册您的控制器。