Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac:解析APIController的依赖项_C#_Asp.net_Asp.net Web Api_Inversion Of Control_Autofac - Fatal编程技术网

C# Autofac:解析APIController的依赖项

C# Autofac:解析APIController的依赖项,c#,asp.net,asp.net-web-api,inversion-of-control,autofac,C#,Asp.net,Asp.net Web Api,Inversion Of Control,Autofac,我是控制反转和自动传真的新手。浏览文档时,有很多ASP.NET Web Api概念我没有完全理解或经验,这使得我很难确定我的实现中缺少了什么 我想将Autofac应用于现有的ASP.NET Web Api项目,该项目具有多个APIController。这些控制器都共享一个父抽象类。这个抽象类有一个负责返回服务实例的方法。我希望用Autofac的依赖注入来取代这种方法 每个ApicController继承的父抽象类非常简单 公共抽象类BaseApiController { 公共IMyService

我是控制反转和自动传真的新手。浏览文档时,有很多ASP.NET Web Api概念我没有完全理解或经验,这使得我很难确定我的实现中缺少了什么

我想将Autofac应用于现有的ASP.NET Web Api项目,该项目具有多个APIController。这些控制器都共享一个父抽象类。这个抽象类有一个负责返回服务实例的方法。我希望用Autofac的依赖注入来取代这种方法

每个ApicController继承的父抽象类非常简单

公共抽象类BaseApiController
{
公共IMyService服务客户端{get;set;}
公共BaseApiController(){}
公共BaseAPI控制器(IMyService服务客户端)
{
this.serviceClient=serviceClient;
}
}
每个控制器都从上述类继承,虽然有些控制器使用默认的Get方法,但大多数控制器都有多个路由。没有一个控制器指定构造函数:

公共类MyController:BaseApiController
{
公共MyController():base(){}
公共MyController(IMyService serviceClient):基本(serviceClient){}
[HttpGet]
[路线(“api/foo/bar”)]
[ActionName(“FooBar”)]
公共字符串FooBar()
{
使用(serviceClient)
{
将serviceClient.GetFooBar()作为字符串返回;
}
}
}
Autofac集成到应用程序Glabal.asax.cs的应用程序启动方法中,注册ServerClientProvider,当遇到对IMyService的依赖时,应将其解析为该提供程序:

公共类全局:System.Web.HttpApplication,IContainerProviderAccessor
{
#区域自动传真
专用静态IContainerProvider\u containerProvider;
公共IContainerProvider ContainerProvider=>\u ContainerProvider;
#端域自动传真
受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
var builder=new ContainerBuilder();
builder.Register(x=>ServiceClientProvider.GetServiceClient())
.As()
.InstancePerRequest();
RegisterApiControllers(Assembly.getExecutionGassembly()).PropertiesAutowired();
builder.registerUBS(Assembly.getExecutionGassembly()).PropertiesAutowired();
var container=builder.Build();
GlobalConfiguration.Configuration.DependencyResolver=新的AutoFacWebAPI DependencyResolver(容器);
GlobalHost.DependencyResolver=新的AutofacDependencyResolver(容器);
_containerProvider=新的containerProvider(集装箱);
}
}
我已在web.config中配置了ASP.NET应用程序:


据我所知,当遇到具有与注册类型匹配的公共属性(属性注入)的控制器时,或者如果存在具有与任何注册依赖项匹配的参数的构造函数,Autofac应该自动解析提供程序

但是,我没有收到任何与Autofac配置相关的错误。当
MyController
尝试调用
IMyService.FooBar
方法时,我得到一个NullReferenceException

我错过了什么


任何帮助都将不胜感激。

在多次尝试调试代码后,我意识到项目中存在另一个启动实现。使用了OWIN,我试图与Autofac集成的启动实现已实例化,但从未使用过。所以按照上面的说明,我得到了我想要的结果

以下是启动实施应注意的事项:

[程序集:OwinStartup(typeof(MyWebApp.Api.StartUp))]
名称空间MyWebApp.Api
{
公营创业
{
公共无效配置(IAppBuilder应用程序)
{
//在OWIN中,您可以创建自己的HttpConfiguration,而不是
//重新使用全局配置。
HttpConfiguration httpconfig=新的HttpConfiguration();
httpconfig.Routes.MapHttpRoute(
名称:“ApiRouteWithAction”,
routeTemplate:“api/{controller}/{action}”);
httpconfig.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
//Autofac信号机集成
var builder=new ContainerBuilder();
//在执行程序集中注册Web API控制器。
RegisterAppController(Assembly.getExecutionGassembly());
//注册信号集线器。
registerUBS(Assembly.getExecutionGassembly());
//注册删除门
builder.Register(x=>ServiceClientProvider.GetServiceClient())
.As()
.InstancePerRequest();
//将依赖项解析程序设置为Autofac。
var container=builder.Build();
httpconfig.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
app.UseWebApi(httpconfig);
//首先注册Autofac中间件,然后注册自定义中间件(如果有)。
app.useautofac中间件(容器);
}
}
}
它继承自的控制器和抽象类进行了调整,删除了无参数构造函数

公共抽象类BaseApiController
{
公共IMyService服务客户端{get;set;}
公共BaseAPI控制器(IMyService服务客户端)
{
this.serviceClient=serviceClient;
}
}
每个控制器都从上述类继承,虽然有些控制器使用默认的Get方法,但大多数控制器都有多个路由。没有一个控制器指定构造函数:

公共类MyController:B