ASP.Net MVC区域没有选择注册类型

时间:2016-01-05 18:39:52

标签: asp.net asp.net-mvc dependency-injection unity-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区域控制器中注入依赖项,我是否还缺少一些额外的步骤?

其他信息

这是区域注册类:

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;
}

1 个答案:

答案 0 :(得分:2)

Web API和MVC是两个完全不同的东西。您的问题最初声明您使用的是MVC,但您的DI配置仅适用于Web API。

MVC(和区域)的配置

根据Dependency Injection Tutorial on MSDN,您缺少DI设置的重要部分 - 即,您的Application_Start方法未设置MVC以使用DI。它仅设置为为Web API配置DI。

您需要实现(或找到基于IControllerFactoryIDependencyResolver的实现,并在应用程序启动时设置它以注入控制器依赖项。

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(container));

// Or...

DependencyResolver.SetResolver(new MyDependencyResolver(container));