蜗牛历险记(二) Web框架(上)
接上篇所说,本篇主要内容是讲述如何使用Autofac来管理整个平台的生命周期(初级)。
一、简述
插件式Web开发的同学应该还会记得PreApplicationStartMethod这个Assembly级别的Attribute,它可以在应用程序启动之初(Web启动之前)启动,一般我们用它来做一些插件资源拷贝、插件动态加载的工作。
1 | [assembly: PreApplicationStartMethod( typeof (PreApplicationInit), "InitializePlugins" )] |
它所指定的代码:
1 2 3 | public static void InitializePlugins() { PluginManager.Current.Initialize(); //插件管理器初始化 } |
所有资源拷贝完毕,插件也被Assembly.Load完毕后,进入正式环节。我们将在Global.asxc的Application_Start方法中进行IOC的初始化。
二、Autofac初始化
第一步,采用Autofac的模块化初始化方式来初始化平台公共模块
1 2 3 4 5 6 7 8 | internal static void BuildFrameworkIocEnviroment(){ var builder = new ContainerBuilder(); builder.RegisterModule( new MvcModule()); builder.RegisterModule( new WebApiModule()); builder.RegisterModule( new LoggingModule()); builder.RegisterModule( new EventsModule()); builder.RegisterModule( new CacheModule()); } |
第二步,采用自动初始化方式将实现注册到IDependency,ISingletonDependency,ILifeScopeDependency,注册结果分别为:每次都重新生成,全局单例,每次请求周期内单例。
1 2 3 4 5 6 7 | var dependency =assemblyTypes.Where(p => ( typeof (IDependency)).IsAssignableFrom(p) && !p.IsAbstract && !p.IsInterface).ToArray(); var singleton = dependency.Where(( typeof (ISingletonDependency)).IsAssignableFrom).ToArray(); var lifescope = dependency.Where(( typeof (ILifeScopeDependency)).IsAssignableFrom).ToArray(); var perdependency = dependency.Except(singleton).Except(lifescope).ToArray(); containBuilder.RegisterTypes(singleton).AsImplementedInterfaces().SingleInstance(); containBuilder.RegisterTypes(lifescope).AsImplementedInterfaces().InstancePerLifetimeScope(); containBuilder.RegisterTypes(perdependency).AsImplementedInterfaces().InstancePerDependency(); |
三、Autofac的使用
为何需要用Autofac这类的IOC初始化容器?在插件式项目开发和基于接口编程的项目中,插件功能内聚,业务逻辑集中在接口实现上。IOC在这方面不经帮我们管理了对象的生命周期,而且方便地将功能由直接实现到面向接口编程(最常用的做法就是将实现注册为对应的接口)。
注册时我们采用了4中注册方式,在Web项目中应用最多的应该是请求周期内单例,所谓请求周期内单例,就是指,在一个请求到达Web程序域环境内,直到它获得Response离开应用程序域之间是单例的,而且各个请求互不干扰。这么做一是方便数据间的传输,二是很大程度上减少对象生成,节约了内存的开销。
如何做到“面向接口”编程?
首先我们定义一个接口以及它的实现。
1 2 3 4 5 6 7 8 9 10 | public interface IService:IDependency { int DoSomeBusiness(); } public class IntService:IService{ public int DoSomeBusiness(){ //do something return 0; } } |
然后我们采用构造函数注入的方式使用它:
1 2 3 4 5 6 7 8 9 10 11 12 | public class HomeController:Controller{ private readonly IService _service; public HomeController(IService service){ _service=service; } public ActionResult Index(){ var val=_service.DoSomeBusiness(); return View(val); } } |
看,这就是最粗显地面向接口编程了,我们在页面上要显示的数据,是通过IService这个接口来实现的,如果业务逻辑改变,我们可以定义新的IService的实现。当然,本例中还是可以很简单地改造为属性构造的。
有关Autofac等的框架就简单介绍到这,博客园有关IOC、Autofac的介绍也有很多,就不细说,这里主要就介绍我所使用的项目中Autofac使用的部分。下一遍将介绍日志框架的实现。
作者:散漫的小蜗牛
出处:http://www.cnblogs.com/leafly
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:UpdateServer@163.com 非常感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步