gpt4 book ai didi

c# - 统一.WebApi |确保 Controller 有一个无参数的公共(public)构造函数

转载 作者:太空狗 更新时间:2023-10-30 00:02:42 24 4
gpt4 key购买 nike

我在 ASP.NET WebApi 解决方案中使用 Unity.WebApi NuGet 包(Unity 4.0.1 和 Unity.WebApi 5.2.3)。我面临的问题是,在尝试运行代码时,出现错误:Make sure that 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 Controller :

public class MyController : ApiController {
private IService service

public MyController(IService service) {
this.service = service;
}

public IHttpActionResult Get() {
return Ok("All systems go!");
}
}

编辑

我删除了 using 语句,因为人们很难理解无论 using 语句是否存在都会出现问题。

最佳答案

根据我的经验,发生这种情况时有 2 种不同的情况。

1.确保可以解析 Service 构造函数中的所有参数。它是否有任何您尚未注册的依赖项?

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

2。确保使用 Web API 注册 Unity。像这样:

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.

关于c# - 统一.WebApi |确保 Controller 有一个无参数的公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34936675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com