專案採用 Castle Windsor 實現控制反轉(IOC),核心概念:
protected void Application_Start() {
RouteManager.RegisterRoutes(RouteTable.Routes);
InitializeWindsor();
}
protected virtual void InitializeWindsor() {
if (container == null) {
container = ContainerBuilder.Build("Configuration\\Windsor.config");
WcfConfiguration.ConfigureContainer(container);
ServiceLocator.SetLocatorProvider(() => container.Resolve<IServiceLocator>());
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
}
}
public static IWindsorContainer Build(string configPath) {
var container = new WindsorContainer(new XmlInterpreter(configPath));
container.Kernel.AddHandlerSelector(new UrlBasedComponentSelector(
typeof(IBaseControllerService), typeof(IImageFileService), typeof(IConnectionStringProvider)));
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;
}
展示了 Controller 自動註冊、Filter/Binder 作為 Component 註冊、ServiceLocator 橋接等進階 IOC 應用模式。