Asp.net MVC示例项目“Suteki.Shop”分析之IOC(控制反转)
er.Kernel.AddHandlerSelector(new UrlBasedComponentSelector( typeof (IBaseControllerService), typeof(IImageFileService), typeof (IConnectionStringProvider) )); // automatically register controllers container.Register(AllTypes .Of<Controller>() .FromAssembly (Assembly.GetExecutingAssembly()) .Configure(c => c.LifeStyle.Transient.Named (c.Implementation.Name.ToLower()))); container.Register( Component.For<IUnitOfWorkManager> ().ImplementedBy<LinqToSqlUnitOfWorkManager>().LifeStyle.Transient, Component.For<IFormsAuthentication> ().ImplementedBy<FormsAuthenticationWrapper>(), Component.For<IServiceLocator>().Instance(new WindsorServiceLocator(container)), Component.For<AuthenticateFilter>().LifeStyle.Transient, Component.For<UnitOfWorkFilter>().LifeStyle.Transient, Component.For<DataBinder>().LifeStyle.Transient, Component.For<LoadUsingFilter>().LifeStyle.Transient, Component.For<CurrentBasketBinder>().LifeStyle.Transient, Component.For<ProductBinder>().LifeStyle.Transient, Component.For<OrderBinder>().LifeStyle.Transient, Component.For<IOrderSearchService>().ImplementedBy<OrderSearchService> ().LifeStyle.Transient, Component.For<IEmailBuilder> ().ImplementedBy<EmailBuilder>().LifeStyle.Singleton ); return container; } 首先是读入指定配置文件的XML结点信息,将构造一个 WindsorContainer实现,同时在其微内核中添加“容器处理组件”的方式 (AddHandlerSelector),注意这种处理方式是按我们在业务逻辑中规定的方式处理的。 紧跟着 又向该容器中注册了Controller,而且配置属性的LifeStyle被指定为Transient类型,这里有必要介绍 一下Castle容器的组件生存周期,主要有如下几种: Singleton : 容器中只有一个实例将被创建 Transient : 每次请求创建一个新实例 PerThread: 每线程中只存在一个实例 PerWebRequest : 每次web请求创建一个新实例 Pooled :使用"池化"方式管 理组件,可使用PooledWithSize方法设置池的相关属性。 可以看到在本项目中,组件的生命周期 基本上都被指定成为Transient类型,即当请求发生时创建,在处理结束后销毁。 接着再看一下 该方法的其余代码,也就是对ModelBinder,Filter,Service这类业务逻辑的组件注册。同时我们看到有 的组类在进行接口注册的同时还被绑定了默认的实现类,其这种硬编码的方法是一种“可选 ”方式。 说完了Build方法之前,再回到Global.asax文件中的InitializeWindsor方法,看 一下其余的代码。我们看到这样一行:
类WcfConfiguration的ConfigureContainer方法就是继续向当前创建的容 器中添加组件,而这次要加入的组件是Windows Live Writer的IMetaWeblog接口实现类,如下:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |