ASP.Net MVC 区域未选择注册类型
ASP.Net MVC Area not picking registered types
我正在开发一个 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 区域控制器中注入依赖项,我是否缺少其他步骤?
附加信息
这里是区域注册class:
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 }
);
}
}
统一容器:
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;
}
Web API 和 MVC 是两个完全不同的东西。您的问题最初是说您使用的是 MVC,但您的 DI 配置仅适用于 Web API.
MVC(和区域)的配置
根据 Dependency Injection Tutorial on MSDN,您遗漏了一个重要的 DI 设置 - 即,您的 Application_Start
方法没有设置 MVC 以使用 DI。仅设置为配置 DI for Web API.
您需要实现(或找到基于)IControllerFactory
或 IDependencyResolver
的实现并在应用程序启动时设置它以注入控制器依赖项。
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(container));
// Or...
DependencyResolver.SetResolver(new MyDependencyResolver(container));
我正在开发一个 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 区域控制器中注入依赖项,我是否缺少其他步骤?
附加信息
这里是区域注册class:
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 }
);
}
}
统一容器:
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;
}
Web API 和 MVC 是两个完全不同的东西。您的问题最初是说您使用的是 MVC,但您的 DI 配置仅适用于 Web API.
MVC(和区域)的配置
根据 Dependency Injection Tutorial on MSDN,您遗漏了一个重要的 DI 设置 - 即,您的 Application_Start
方法没有设置 MVC 以使用 DI。仅设置为配置 DI for Web API.
您需要实现(或找到基于)IControllerFactory
或 IDependencyResolver
的实现并在应用程序启动时设置它以注入控制器依赖项。
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(container));
// Or...
DependencyResolver.SetResolver(new MyDependencyResolver(container));