1

我使用Unity.WebApi NuGet包(统一4.0.1和5.2.3 Unity.WebApi)在ASP.NET的WebAPI的解决方案。我现在面临的问题是,试图运行代码时,我得到的错误:​​。我在这里搜索了类似的线程,但我找不到符合我的问题的任何线程。Unity.WebApi |确保控制器具有一个无参数的公共构造

请不要只说“添加参数的构造函数”,因为它表明你显然不知道什么国际奥委会为什么该声明使得完全没有意义和失败的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语句是否是存在的。

+1

你能分享关于服务类的细节吗?你是否错过了注册服务类所需的任何类? – Noor

+1

难道你的容器在被MVC实际使用之前就被丢弃了吗?它会抛出这个错误是不合逻辑的,但也许。尝试从使用块中取出var container = new UnityContainer()。 – NightOwl888

+0

Noor没有可共享的细节。假设它所做的只是打印“Hello World”的方法。 NightOwl888我原本是这么做的,所以情况并非如此。在尝试解决这个问题的时候,使用来了。 我认为这是不可靠的,因为它是基于Owin的,但我不确定。 –

回答

11

在我的经验,当这种情况发生的2个不同的场景。

1. 确保可以解析Service构造函数中的所有参数。它有没有注册的依赖关系?

Make sure that the controller has a parameterless public constructor in Unity

2. 确保使用Web API来注册统一。像这样:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Routes and other stuff here... 

     var container = IocContainer.Instance; // Or any other way to fetch your container. 
     config.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 

例子在这里:

Injecting Dependency into Web API Controller

http://codeclimber.net.nz/archive/2015/02/20/Using-Entity-Framework-within-an-Owin-hosted-Web-API-with.aspx

编辑1:

正如@ NightOwl888在评论中提到的,你不应该处理的容器。在登记注册的容器,容器配置时,它会不知道如何解决的依赖关系。这可能会导致您看到的错误。

编辑2:

由于您使用Owin你应该能够做这样的事情:

public void Configuration(IAppBuilder appBuilder) 
    { 
     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 
     config.DependencyResolver = new UnityDependencyResolver(
      UnityConfig.GetConfiguredContainer()); 

     config.Routes.MapHttpRoute( 
        name: "DefaultApi", 
        routeTemplate: "api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

     appBuilder.UseWebApi(config); 
    } 

并更新UnityConfig这样:

public static class UnityConfig { 
     public static IUnityContainer GetConfiguredContainer() { 
      var container = new UnityContainer(); 
      // Register controller 
      container.RegisterType<MyController>(); 

      // Register interface 
      container.RegisterType<IService, Service>(); 

      //This is done in Startup instead. 
      //GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
      return container; 
    } 
} 

来自此源: How to use DI container when OwinStartup

http://damienbod.com/2013/10/01/self-host-webapi-with-owin-and-unity/

In this method, the HttpConfiguration.DependencyResolver is set to a UnityDependencyResolver instance. This is required so that contructor injection can be used in the webApi controllers. The UnityDependencyResolver class is exactly the same as the Unity.WebApi.UnityDependencyResolver class. Unity.WebApi is not used because this is a self hosted OWIN application.

+0

请参阅我的意见回答NightOwl的问题。使用声明是在发生这些问题之后发生的,并且是在尝试解决问题的过程中添加的。如果使用在那里没关系,我仍然看到相同的问题。此外,假设该服务没有任何内容,它有一个空的默认构造函数。或者,如果你的想象力想要疯狂地运行,假设它有一个方法可以打印出“Hello world”,同样也是一个空的默认构造函数。换句话说,您的解决方案不能解决此问题。 –

+0

我明白了。你还注册了WebApi(2)的DependencyResolver?请注意,这是与常规MVC不同的注册。在那种情况下,我没有想法。 – smoksnes

+0

我已经用Owin注册Unity for WebAPi的示例进行了更新。 – smoksnes

0

设置DependencyResolver你在启动时,不GlobalConfiguration.Configuration创建并确保您的所有服务的构造是公开的,希望这有助于

0

确保任何嵌套类型的也是HttpConfiguration注入正在被正确解决。即使嵌套类型被错误解析,您也会在控制器级别收到错误消息。

相关问题