OWIN是否可作为依赖注入容器?ASP.NET 4.8项目技术疑问
OWIN 能否作为 ASP.NET 4.8 的依赖注入容器?
OWIN 不是依赖注入(DI)容器,它和Autofac、Ninject这类专门的DI框架定位完全不同,别搞混了。
先搞懂OWIN到底是什么
OWIN是Open Web Interface for .NET的缩写,本质是一套规范——定义了.NET Web服务器和Web应用之间的交互接口,核心目的是解耦服务器和应用,让你的ASP.NET应用可以脱离IIS运行(比如用Katana、Nowin这类轻量服务器)。它管的是请求从服务器到应用的流转管道,和依赖注入没有直接的容器功能。
为什么会有人把它和DI联系起来?
很多成熟的DI框架(比如Autofac、Ninject)都提供了OWIN集成包,用来把DI容器和OWIN管道结合起来。比如Autofac的Autofac.Owin包,能让你在OWIN中间件里使用注入的服务,或者让DI容器管理OWIN相关组件。但这是DI容器适配OWIN,不是OWIN本身当DI容器用。
ASP.NET 4.8引入DI的正确姿势
如果你的项目要加DI,直接用专门的DI框架就行:
- 优先选Autofac、Ninject这类成熟工具,它们都有完善的ASP.NET 4.8集成方案;
- 甚至可以用ASP.NET 4.8自带的
System.Web.Mvc.DependencyResolver来对接DI容器,不用额外装太多东西; - 如果你的项目同时要用OWIN(比如要自托管应用),可以把DI容器和OWIN管道整合,比如用Autofac的OWIN集成,在OWIN启动时配置容器,然后在中间件或MVC控制器里正常注入服务。
举个简单的代码示例(Autofac+OWIN):
public class Startup { public void Configuration(IAppBuilder app) { // 初始化Autofac容器构建器 var builder = new ContainerBuilder(); // 注册业务服务 builder.RegisterType<OrderService>().As<IOrderService>(); // 注册MVC控制器 builder.RegisterControllers(typeof(MvcApplication).Assembly); // 构建容器 var container = builder.Build(); // 给MVC设置DI解析器 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // 把容器接入OWIN管道 app.UseAutofacMiddleware(container); app.UseAutofacMvc(); // 配置MVC路由等 app.UseMvc(routes => { routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }); } }
内容的提问来源于stack exchange,提问作者user20377051
相关产品推荐
相关产品推荐

