我正在开发一个ASP.Net应用程序,其中定义了几个MVC Areas
。当我尝试在Area
内的控制器上使用依赖注入时,我收到以下错误。
No parameterless constructor defined for this object.
我正在使用Unity容器,看来注册的依赖项没有进入MVC Area
。
设置在global.asax.cs
:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(MyConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
为了在MVC区域控制器中注入依赖项,我是否还缺少一些额外的步骤?
这是区域注册类:
public class MyAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "MyArea";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"MyArea_default",
"MyArea/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Unity Container:
public static class MyConfig{
public static IUnityContainer dependencyResolver { get; set; }
public static void Register(HttpConfiguration config)
{
// Create Unity container
var container = new UnityContainer();
// Register service types
container.RegisterType<ISomeService, SomeService>();
// omitted for brevity
// Create unity resolver
config.DependencyResolver = new UnityResolver(container);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
dependencyResolver = container;
}
区域控制器:
private ISomeServce SomeServce;
public LabController(ISomeServce someServce)
{
SomeServce = someServce;
}
答案 0 :(得分:2)
Web API和MVC是两个完全不同的东西。您的问题最初声明您使用的是MVC,但您的DI配置仅适用于Web API。
根据Dependency Injection Tutorial on MSDN,您缺少DI设置的重要部分 - 即,您的Application_Start
方法未设置MVC以使用DI。它仅设置为为Web API配置DI。
您需要实现(或找到基于IControllerFactory
或IDependencyResolver
的实现,并在应用程序启动时设置它以注入控制器依赖项。
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(container));
// Or...
DependencyResolver.SetResolver(new MyDependencyResolver(container));