Gil*_*rdo 10 asp.net asp.net-mvc dependency-injection controller simple-injector
我有一个新的MVC Web项目,我在MVC和WebApi中使用.我在我的全局文件中使用以下代码设置了Simple Injector(来自nuGet的2.5.2版本)
// Register Injectors
SimpleInjectorConfig.Register();
Run Code Online (Sandbox Code Playgroud)
在我的SimpleInjectorConfig.cs文件中
public class SimpleInjectorConfig
{
public static void Register() {
// Create the container as usual.
Container container = new Container();
// services
container.Register<IService, MyService>();
// data
container.Register<IRepository, MyRepository>();
// Register your types, for instance using the RegisterWebApiRequest
// extension from the integration package:
container.RegisterMvcControllers(
System.Reflection.Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
// verify its all ok
container.Verify();
// add dependency
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有2个控制器,1个是webApi控制器,1个是普通的MVC控制器.
我的WebApi控制器工作正常,看起来像这样
public class MyApiController : ApiController
{
private IService _service;
public MyApiController(IService service)
{
_service = service;
}
/// <summary>
/// GET api/<controller>/5
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public IHttpActionResult Get(int id)
{
// i get my entity here and return it
EntityObject myEntity = _service.Get(id);
return Ok(myEntity);
}
}
Run Code Online (Sandbox Code Playgroud)
正如我所说上面的代码工作正常,我可以执行网址,它返回我所期望的.
现在我有了我的MVC视图控制器,它看起来非常类似于上面的,就在这里
public class MyController : Controller
{
private IService _service;
public MyController(IService service)
{
_service = service;
}
public ActionResult Index()
{
return Search();
}
// Company/Search
public ActionResult Search()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我无法理解为什么我一直收到以下错误.我无法添加公共构造函数,因为这会导致SimpleInjector出错.
System.MissingMethodException:没有为此对象定义的无参数构造函数.
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
System.Activator.CreateInstance(Type type) +66
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +110
[InvalidOperationException: An error occurred when trying to create a controller of type 'my.project.Web.Controllers.MyController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +438
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +257
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +328
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +157
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Run Code Online (Sandbox Code Playgroud)
如果有人能指出我正确的方向,那将是伟大的.
Ste*_*ven 21
出现此错误的原因是您缺少以下注册(如MVC集成指南中所述):
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
MVC和Web API都有自己的解析依赖关系的抽象(都称为"依赖解析器").由于您没有为MVC设置解析器,MVC使用默认解析机制来创建MVC控制器,但这需要控制器具有默认构造函数.
通话DependencyResolver.SetResolver将解决问题.