是否有可能configurationAutofac使用ASP.NET MVC和ASP.NET Web Api
是否可以configurationAutofac使用ASP .NET MVC和ASP .NET Web Api。 我知道依赖parsing器是不同的。 但是当使用logging的方法时,我只能设置一个全局parsing器。
// Set the dependency resolver implementation. GlobalConfiguration.Configuration.DependencyResolver = resolver;
这个方法不好吗? 我应该将我的解决scheme分成两个项目,并分别处理每个dependency injection?
当然也可以configurationAutofac来同时使用MVC和Web API。 预计这是一个非常普遍的情况。 有两个独立的依赖parsing器实现,因为MVC和Web API可以独立使用。 这同样适用于Autofac集成。
在同一个应用程序中同时使用MVC和Web API时,每个需要自己的依赖关系parsing器,尽pipe它们可以提供相同的容器实例。
var builder = new ContainerBuilder(); // Add your registrations var container = builder.Build(); // Set the dependency resolver for Web API. var webApiResolver = new AutofacWebApiDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; // Set the dependency resolver for MVC. var mvcResolver = new AutofacDependencyResolver(container); DependencyResolver.SetResolver(mvcResolver);
也可以在两者之间共享注册,因为InstancePerApiRequest
和InstancePerHttpRequest
生存期范围现在共享相同的标记。
请注意,为Web API和MVC设置依赖关系parsing器的机制是不同的。 Web API使用GlobalConfiguration.Configuration.DependencyResolver
,MVC使用DependencyResolver.SetResolver
。
我想我会添加一些帮助,这些在mvc5和web api 2挣扎。
首先添加nuget包
- Autofac
- Autofac asp.net mvc 5集成
- Autofac的asp.net web api 2.x集成
在全球范围内添加application_start(或作为app_start类)添加到下面的类的调用
AutofacConfig.RegisterAutoFac();
现在在App_start下添加这个类
using System.Reflection; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; using Autofac.Integration.WebApi; namespace Example1.Web { public class AutofacConfig { public static IContainer RegisterAutoFac() { var builder = new ContainerBuilder(); AddMvcRegistrations(builder); AddRegisterations(builder); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); return container; } private static void AddMvcRegistrations(ContainerBuilder builder) { //mvc builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); builder.RegisterModelBinderProvider(); //web api builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); builder.RegisterModule<AutofacWebTypesModule>(); } private static void AddRegisterations(ContainerBuilder builder) { //builder.RegisterModule(new MyCustomerWebAutoFacModule()); } } }
从现在开始,为每个添加到项目中的新程序集添加一个新模块,然后在AddRegisterations函数中注册模块(给出的例子)
注意 :
我退回了容器,这是没有必要的。
这将扫描当前程序集的模块,所以不要在AddRegisterations中添加本地模块,否则您将注册一切两次。
绝对分开他们。 Autofac拥有ASP.NET MVC和ASP.NET Web API集成。 这并非总是如此,但是如果您在这两个应用程序中都需要相同的服务,则很可能应用程序体系结构出现问题。
以下是您可以如何使用ASP.NET Web API执行此操作的方法:
internal class AutofacWebAPI { public static void Initialize(HttpConfiguration config) { config.DependencyResolver = new AutofacWebApiDependencyResolver( RegisterServices(new ContainerBuilder()) ); } private static IContainer RegisterServices(ContainerBuilder builder) { builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired(); //deal with your dependencies here builder.RegisterType<CarsService>().As<ICarsService>(); builder.RegisterType<CarsCountService>().As<ICarsCountService>(); return builder.Build(); } }
然后,在Global.asax.cs中注册这个如下:
AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);
- ASP.NET MVC:如何让浏览器打开并显示PDF,而不是显示下载提示?
- Asp.Net MVC 2 – 将模型的属性绑定到不同的命名值
- 整数值的必需属性
- 如何解决:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误的模块“ManagedPipelineHandler”
- 发布JSON数据到ASP.NET MVC
- Server 2012 IIS 8 MVC应用程序显示默认的IIS主页或403/404错误
- redirect从asp.net web api发布操作
- ASP.Net MVC RedirectToAction与锚点
- 通过POST(ajax)发送JSON数据并从Controller(MVC)接收json响应