MVC5依赖注入问题

时间:2015-02-20 16:15:58

标签: asp.net-web-api dependency-injection asp.net-mvc-5 unity-container

我使用带有洋葱架构方法的MVC5创建了一个应用程序。该解决方案包含3个项目(核心,基础架构和UI)。 UI包含Web API控制器和MVC控制器。我遇到的问题是依赖注入。我安装了Unity.MVC5& Unity.WebApi。我UnityConfig.cs下的App_Start看起来像这样:

public static void RegisterComponents()
    {
        var container = new UnityContainer();

        container.RegisterType<IPricingService, PricingService>();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
    }

我的global.asax看起来像这样:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        System.Web.Http.GlobalConfiguration.Configure(WebApiConfig.Register);

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        UnityConfig.RegisterComponents();

    }

为了测试我的控制器,我定义了我的家庭控制器:

private readonly IPricingService _pricingService;

    public HomeController(IPricingService PricingService)
    {
        this._pricingService = PricingService;
    }

运行主页时我得到了 没有为此对象定义无参数构造函数。

现在,转到另一个测试场景,我创建了一个web api控制器,看起来像这样:

private readonly IPricingService _pricingService;

    public TestApiController(IPricingService PricingService)
    {
        this._pricingService = PricingService;
    }

测试web api会产生此错误:

尝试创建“TextApiController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。“,”exceptionType“:”System.InvalidOperationException“

不确定我缺少什么。请指教。

1 个答案:

答案 0 :(得分:1)

您应该将Unity.WebApi.DependencyResolver注入GlobalConfiguration.Configuration.DependencyResolver中的网络Api配置而非

public static void Register(HttpConfiguration config)
{
    var container = new UnityContainer();
    container.RegisterType<IProductRepository, ProductRepository>(new HierarchicalLifetimeManager());
    config.DependencyResolver = new UnityResolver(container);

    // Other Web API configuration not shown.
}

您还需要在BeginScope方法as shown in this MSDN article中实现子容器。