快速业务通道

Asp.net MVC示例项目“Suteki.Shop”分析之IOC(控制反转)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
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 (container);

类WcfConfiguration的ConfigureContainer方法就是继续向当前创建的容 器中添加组件,而这次要加入的组件是Windows Live Writer的IMetaWeblog接口实现类,如下:

public static class WcfConfiguration
{
public static void ConfigureContainer(IWindsorContainer container)
{
var returnFaults = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true };

container.AddFacility<WcfFacility>(f =>
{
f.Services.AspNetCompatibility = AspNetCompatibilityRequirementsMode.Required;
f.DefaultBinding = new XmlRpcHttpBinding();
})
.Register(
Component.For<IServiceBehavior>().Instance(returnFaults),
Compone

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号