我使用带有洋葱架构方法的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“
不确定我缺少什么。请指教。
答案 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中实现子容器。