【发布时间】:2016-04-28 11:04:10
【问题描述】:
我在 ASP.NET WebApi 解决方案中使用 Unity.WebApi NuGet 包(Unity 4.0.1 和 Unity.WebApi 5.2.3)。我面临的问题是,在尝试运行代码时,出现错误:Make sure that the controller has a parameterless public constructor。我在这里搜索过类似的主题,但找不到任何与我的问题匹配的主题。
请不要只说“添加无参数构造函数”,因为它表明您显然不知道 IoC 是什么,以及为什么该声明完全没有意义并且违背了 IoC 的目的。我这么说是因为我在迄今为止看过的很多其他线程上都看到了这一点。
这是我的 Startup.cs(我使用的是 Owin,所以我没有 Global.asax):
public void Configuration(IAppBuilder app) {
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// Registering unity stuff
UnityConfig.RegisterComponents();
app.UseWebApi(config);
}
这是我的 UnityConfig.cs:
public static class UnityConfig {
public static void RegisterComponents() {
var container = new UnityContainer();
// Register controller
container.RegisterType<MyController>();
// Register interface
container.RegisterType<IService, Service>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
}
这是我的 API 控制器:
public class MyController : ApiController {
private IService service
public MyController(IService service) {
this.service = service;
}
public IHttpActionResult Get() {
return Ok("All systems go!");
}
}
编辑
我删除了 using 语句,因为人们很难理解无论 using 语句是否存在都会出现问题。
【问题讨论】:
-
您能分享有关服务类的详细信息吗?您是否缺少注册 Service 类所需的任何类?
-
可能是您的容器在 MVC 实际使用它之前就被处置了吗?它会抛出这个错误是不合逻辑的,但也许。尝试将
var container = new UnityContainer()从 using 块中取出。 -
Noor 没有细节可以分享。假设它所做的只是有一个打印“Hello World”的方法。 NightOwl888 我最初是这样做的,所以事实并非如此。在试图解决这个问题时,使用后来出现了。我认为这很奇怪,因为它是基于 Owin 的,但我不确定。
-
@NightOwl888 是正确的。从 using 语句中取出统一容器和 http 配置。在收到第一个 Web 请求之前,它们都会被处理掉。
-
@TylerOhlsen 无论使用是否存在,都会导致相同的错误。
标签: c# asp.net-web-api dependency-injection inversion-of-control unity-container