模式依赖注入

依赖注入  时间:2021-02-19  阅读:()

模式&框架Pattern&Framework*InstituteofComputerSoftwareNanjingUniversity*摘要MoreaboutPatternFrameworkComparison*InstituteofComputerSoftwareNanjingUniversity*摘要MoreaboutPatternFrameworkComparison*InstituteofComputerSoftwareNanjingUniversity*MoreaboutPatternPatternsofPatternsAnti-patternJ2EEpatterns*InstituteofComputerSoftwareNanjingUniversity*MoreaboutPatternPatternsofPatternsAnti-patternJ2EEpatterns*InstituteofComputerSoftwareNanjingUniversity*WorkingtogetherPatternsareoftenusedtogetherandcombinedwiththesamedesignsolution.
Acompoundpatterncombinestwoormorepatternsintoasolutionthatsolvesarecurringorgeneralproblem.
*InstituteofComputerSoftwareNanjingUniversity*Example:设计一个文档编辑器设计问题文档结构格式化修饰用户界面支持多种视感(look-and-feel)标准支持多种窗口系统用户操作拼写检查和连字符*InstituteofComputerSoftwareNanjingUniversity*使用设计模式Composite表示文档的物理结构:递归组合Strategy允许不同的格式化算法Decorator修饰用户界面AbstractFactory支持多视感标准Bridge允许多个窗口平台Command支持撤销用户操作Iterator访问和遍历对象结构Visitor允许无限扩充分析能力而又不会使文档结构的实现复杂化*InstituteofComputerSoftwareNanjingUniversity*DuckExampleStartwithabunchofQuackables.
.
AgoosecamealongandwantedtoactlikeaQuakabletoo.
Then,theQuackologistsdecidedtheywantedtocountquacks.
ButtheQuackologistswereworriedthey'dforgettoaddtheQuackCounterdecorator.
Wehadmanagementproblemskeepingtrackofallthoseducksandgeeseandquackables.
TheQuackologistsalsowantedtobenotifiedwhenanyquackablequacked.
*InstituteofComputerSoftwareNanjingUniversity*AdapterDecoratorAbstractfactoryCompositeIteratorObserverCompoundPatternsMVCasongaboutMVCbyJamesDempsey(lyrics)*InstituteofComputerSoftwareNanjingUniversity*MVCMVCisacompoundpatternconsistingoftheObserver(model),Strategy(controller)andComposite(view)patterns.
TheAdapterpatterncanbeusedtoadaptanewmodeltoanexistingviewandcontroller.
*InstituteofComputerSoftwareNanjingUniversity*PatternDefinitionReviewAPatternisasolutiontoaprobleminacontext.
Context:therecurringsituationinwhichthepatternappliesProblem:thegoalyouaretryingtoachieveinthiscontextandanyconstrainsthatoccurinthecontext.
Solution:ageneraldesignthatanyonecanapplywhichresolvesthegoalandsetofconstraints*InstituteofComputerSoftwareNanjingUniversity*PatternCategoriesI--GoalCreationalPatterns:involveobjectinstantiationandallprovideawaytodecoupleaclientfromtheobjectsitneedstoinstantiate.
StructuralPatterns:composeclassesorobjectsintolargerstructures.
BehavioralPatterns:concernedwithhowclassesandobjectsinteractanddistributeresponsibility*InstituteofComputerSoftwareNanjingUniversity*PatternCategoriesII--ScopeClassPatternsDescribehowrelationshipsbetweenclassesaredefinedviainheritance.
Relationshipsinclasspatternsareestablishedatcompiletime.
*InstituteofComputerSoftwareNanjingUniversity*TemplateMethodInterpreterAdapterFactoryMethodPatternCategoriesII--ScopeObjectPatternsDescriberelationshipsbetweenobjectsandareprimarilydefinedbycomposition.
Relationshipsinobjectpatternsaretypicallycreatedatruntimeandaremoredynamicandflexible*InstituteofComputerSoftwareNanjingUniversity*CompositeDecoratorVisitorCommandIteratorMementoProxyFacadeChainofResponsibilityObserverBuilderSingletonPrototypeFlyweightStateMediatorBridgeAbstractFactoryStrategyMoreaboutPatternPatternsofPatternsAnti-patternJ2EEpatterns*InstituteofComputerSoftwareNanjingUniversity*Anti-PatternsAndrewKoenig1995,MichaelAkroyd1996Ananti-pattern(反面模式)tellsyouhowtogofromaproblemtoaBADsolution.
Tellyouwhyabadsolutionisattractive.
Tellyouwhythatsolutioninthelongtermisbad.
Suggestotherpatternsthatareapplicablewhichmayprovidegoodsolutions.
*InstituteofComputerSoftwareNanjingUniversity*Wiki反面模式分类组织结构的反面模式项目管理的反面模式团队管理的反面模式分析方式的反面模式一般设计上的反模式面向对象设计的反面模式编程上的反模式方法学上的反面模式测试反面模式配置管理反面模式*InstituteofComputerSoftwareNanjingUniversity*AnemicDomainModelBaseBeanCallsuperCircle-ellipseproblemEmptysubclassfailureGodobjectObjectcesspoolObjectorgyPoltergeistsSequentialcouplingSingletonitiesYetanotherfuckinglayerYo-yoproblemExample胖球反模式通过描述一个或几个类不断的膨胀,以至吞食掉整个面向对象架构.
一般胖球的出现是由于一个类垄断了处理过程,而其他的类只是数据的封装体.
症状和后果单个类拥有大量的属性或操作.
单个类中封装了异类的、不相关的属性和操作集.
单个控制器类和几个简单的数据对象联系在一起.
缺乏面向对象的设计,一个控制器类几乎封装了所有的应用功能.
控制器类通常过于复杂,无法复用和测试.
把这么个大类加载如内存中的代价可能会很高.

胖球反模式有两种形式:行为形式和数据形式.
*InstituteofComputerSoftwareNanjingUniversity*Example如何重构(Refactor)把一些行为重新分配到某些封装了数据的对象上,并对对象之间的关系重新调整.
确定代表契约的关系操作和属性集合,也就是把相关的属性和方法归类.
寻找这些根据契约的到了集合的"自然的家",并把它们迁移过去.
移除所有的"远耦合"或者说冗余的、间接的联系.
最后,移除所有的瞬时联系.

总之,把一个控制器类变成了一个协调器类,让开始的数据类扩充一些处理逻辑,数据类在协调类的指导下进行操作,这也只是职责的迁移.

*InstituteofComputerSoftwareNanjingUniversity*MoreaboutPatternPatternsofPatternsAnti-patternJ2EEpatterns*InstituteofComputerSoftwareNanjingUniversity*J2EEPatterns特点与平台、语言相关,描述的是J2EE平台上利用Java如何解决设计问题所解决问题的规模较大,在J2EE框架的基础上解决构件技术的选择、构件之间的协作等问题模式抽象层次较高,同时提供了若干具体实现的细节,称为策略.
注重性能的优化*InstituteofComputerSoftwareNanjingUniversity*J2EEPatternsClassification根据来源分为SJC设计模式和TheServerSide设计模式两大类J2EE:JSP,Servlet,EJB,JMS,JDBC,JNDISJC(SunJavaCenter)设计模式Web层模式:JSP,ServletInterceptingFilter,FrontController,ViewHelper…业务层模式:EJBBusinessDelegate,ValueObject,SessionFaade…集成层模式:JMS,JDBCDataAccessObject,ServiceActivator**J2EEPatternsClassificationTheServerSide设计模式EJB层体系结构模式SessionFaade,MessageFaade,EJBCommand…层间数据传输模式DataTransferObject,DataTransferHashMap…事务与持久性模式VersionNumber,JDBCforReading…客户端EJB交互模式EJBHomeFactory,BusinessDelegate*InstituteofComputerSoftwareNanjingUniversity*ExampleEJB调用是工厂模式的实现调用EJB语法:EJBHomeem=JNDIServer.
getRemoteHome(EJB-JNDI-NAME);EJBObjectmyEJB=em.
create();em.
create()类似Afactory.
create();EJBObject是接口*InstituteofComputerSoftwareNanjingUniversity*Example会话Bean和实体Bean:Faade模式一个会话Bean中调用多个实体Bean该会话Bean是一个Faade类/Manager类使用Faade会话Bean优点:提供性能,节省客户端直接调用实体Bean的网络开销解耦分层,利于扩展变化.

*InstituteofComputerSoftwareNanjingUniversity*ExampleDTO(DataTransferObject)模式DTO模式是指将数据封装成普通的JavaBeans,在J2EE多个层次之间传输.
DTO类似信使,是同步系统中的Message该JavaBeans可以是一个数据模型Model*InstituteofComputerSoftwareNanjingUniversity*ExampleMVC模式MVC模式是J2EEWeb层的主要实现*InstituteofComputerSoftwareNanjingUniversity*ExampleProxy模式代理模式可以强迫客户端对一个对象的方法调用间接通过代理类进行.
通常代理模式有以下几种:访问代理(AccessProxy)、虚拟代理和远程代理等.
动态Proxy模式动态代理利用Java的反射(Reflect)机制,可以在运行时刻将一个对象实例的方法调用分派到另外一个对象实例的调用.
动态代理模式可以在运行时刻创建继承某个接口的类型安全的代理对象,而无需在代码编译时编译这些代理类代码.

*InstituteofComputerSoftwareNanjingUniversity*J2EEAnti-Pattern无EJB不叫J2EE过度分层频繁的往返调用过度使用有状态的SessionBean过度会话万能Servlet或者万能JSP*InstituteofComputerSoftwareNanjingUniversity*Now…OODesignToolboxOOBasicsOOPrinciplesOOPatternsYourpatternshere!
*InstituteofComputerSoftwareNanjingUniversity*摘要MoreaboutPatternFramework:why,what,howComparison*InstituteofComputerSoftwareNanjingUniversity*Formsofdesign-levelreuseSharingofconsistency:programmingandscriptinglanguageSharingconcretesolutionfragments:librariesSharingcontracts:interfacesSharingindividualarchitecture:patternsSharingsubsystemarchitectures:frameworksSharingoverallstructure:systemarchitectures.
*InstituteofComputerSoftwareNanjingUniversity*Framework[GoF]:Aframeworkisasetofcooperatingclasses,someofwhichmaybeabstract,thatmakeupareusabledesignforaspecificclassofsoftware.
Asoftwareframeworkisanabstractioninwhichcommoncodeprovidinggenericfunctionalitycanbeselectivelyoverriddenorspecializedbyusercode,thusprovidingspecificfunctionality.
Frameworksareaspecialcaseofsoftwarelibrariesinthattheyarereusableabstractionsofcodewrappedinawell-definedAPI,yettheycontainsomekeydistinguishingfeaturesthatseparatethemfromnormallibraries.
*InstituteofComputerSoftwareNanjingUniversity*Framework框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.
简单说就是使用别人搭好的舞台,你来做表演.
而且,框架一般是成熟的,不断升级的软件.
框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层.

*InstituteofComputerSoftwareNanjingUniversity*Framework*InstituteofComputerSoftwareNanjingUniversity*应用程序专业领域框架一般性应用框架支持性框架作业系统应用框架FrameworkFirstcommercialapplicationframework:MacAppbyAppleComputerforMacintoshWell-knownframeworksMFCStruts,Spring,Avalon,PicoContainerHibernateJdon…*InstituteofComputerSoftwareNanjingUniversity*Framework特点Inversionofcontrol-Theoverallprogram'sflowofcontrolisnotdictatedbythecaller,butbytheframework.
Defaultbehavior-Aframeworkhasadefaultbehavior.
Thisdefaultbehaviormustactuallybesomeusefulbehaviorandnotaseriesofno-ops.
Extensibility-Aframeworkcanbeextendedbytheuserusuallybyselectiveoverridingorspecializedbyusercodeprovidingspecificfunctionality.
Non-modifiableframeworkcode-Theframeworkcode,ingeneral,isnotallowedtobemodified.
Userscanextendtheframework,butnotmodifyitscode.
*InstituteofComputerSoftwareNanjingUniversity*Howtodesignagoodframework领域驱动设计(DomainDrivenDesign)控制反转IoC(InversionofControl)or依赖注入DI(DependenceInjection)AOP(AspectOrientedProgramming)……*InstituteofComputerSoftwareNanjingUniversity*DomainDrivenDesign简称DDDhttp://domaindrivendesign.
org/Thepremiseofdomain-drivendesignistwo-fold:Formostsoftwareprojects,theprimaryfocusshouldbeonthedomainanddomainlogic;andComplexdomaindesignsshouldbebasedonamodel.
*InstituteofComputerSoftwareNanjingUniversity*DDDBackground开始有人抱怨使用Java开发Web网站系统,类似大炮轰蚊子.
"RubyonRails(RoR)是Web系统主打选择"对Java世界提出冲击和挑战.
但是使用另外一种语言有其他陷阱.
对Java世界提出:吸取DDD框架(RoR)优点,真正简化Java企业系统开发,不能打着简化反简化,不能因为IoC/AOP导致复杂化.

*InstituteofComputerSoftwareNanjingUniversity*DDDDomain-drivendesignisnotatechnologyoramethodology.
Itisawayofthinkingandasetofpriorities,aimedatacceleratingsoftwareprojectsthathavetodealwithcomplicateddomains.
*InstituteofComputerSoftwareNanjingUniversity*大师说DDD*InstituteofComputerSoftwareNanjingUniversity*DDD核心思想:面向领域模型(DomainModel)编程,尽可能减少层次之间混乱调用,化多层编码为多层配置,提供多层编码中各层的缺省实现前提:不能丧失多层结构,否则返回Delphi/VB时代;保证多层之间的松耦合.
*InstituteofComputerSoftwareNanjingUniversity*DDD特点统一语言:一个无处不在(ubiquitous)的语言,项目中所有人统一交流的语言.
减少沟通疑惑,减少传达走样.
使得软件更加适合需求.
统一领域模型:领域专家和程序员统一使用一种模型,没有数据库数据表等专业软件技术干扰.
专门的业务领域层:领域层除了业务没有其他,没有软件架构框架等等底层技术.
以模型为核心的卫星图DomainModelDomainServiceLoggingGUIPersistence坏设计之一:失血模型尽管使用MVC模式和框架,但是将大部分业务逻辑写在控制器Controller中,如Struts的Action.
甚至一个Action有几千行.
尽管使用SOA的服务,但是将大部分业务逻辑写在服务中.
在上面两种设计中,模型是只有setter/getter方法失血模型.
模型对象成了纯粹的数据包装,没有业务行为和方法.
失血模型导致软件难于拓展和维护,重新回到面向过程的编程老思路.
随着时间推移,开发效率降低.

坏设计之二:基于数据表的设计最初订单有OrderItemId,OrderId,ProductId和Qty.
后来添加MinDeliveryQty和PendingQty字段,这是和订单交货有关.
订单和订单交货是两个概念,但是我们把这些字段都混合在一个类中了.
尽管采取了OO设计,但这还是一种带有数据库设计影子的坏设计.

DDD设计:将实体的职责分离到不同限定场景.
领域设计和数据库设计不同领域不是把实体看成铁板一块,一开始就把它分解到各种场景.
下订单和订单交货交付是两个场景,它们应该有彼此独立的接口,由实体来实现.
在数据库中它们是一个,也就是说,从ER模型上看,它们是一个整体,但是从domainmodel领域模型角度看,它们是分离的.
DDDadvantage左图:跨层混乱;右图:以Model为线索有条理*InstituteofComputerSoftwareNanjingUniversity*以JdonFramework(JF)为例DomainModel是JF系统的第一个设计开发对象.
每个Model都必须有一个主键;或唯一标识.
由DomainModel延伸界面模型和持久实体.
*InstituteofComputerSoftwareNanjingUniversity*以Domain为核心http://www.
jdon.
com/jdonframework/基于JF的DDD最佳实践*InstituteofComputerSoftwareNanjingUniversity*ModelConfiguration使用配置替代传统MVC模式Controller编码:*InstituteofComputerSoftwareNanjingUniversity*IoC控制反转InversionofControlReviewDesignPrinciples:DIP(dependenceinversion)HollywoodPrinciple:Don'tcallus,we'llcallyou.
依赖注入DependenceInjection(byMartinFowler)http://www.
martinfowler.
com/articles/injection.
html*InstituteofComputerSoftwareNanjingUniversity*IoCMotivationFirstWeknewfrombasicJavatutorial,thatallobjectsshouldbecreatedfirstbeforeuse.
ThenWeknewhowtocreateobjectsbyusageoffactorypatterns.
NowWewillstudyhowtogetanobjectfromanIoCcontaineranduseitwithoutcreatingitbyourselves.
*InstituteofComputerSoftwareNanjingUniversity*abc=newABC()abc=Factory.
createInstanceOfABC()Example*InstituteofComputerSoftwareNanjingUniversity*publicclassJDBCDataManger{publicvoidaccessData(){DataSourcedataSource=newDataSource();//accessdata.
.
.
}}publicclassJDBCDataManger{publicvoidaccessData(){DataSourcedataSource=ApplciationResources.
getDataSource();//accessdata.
.
.
}}Ineithercase,theJDBCDataManagerhastofetchtheDataSourceitself!
http://today.
java.
net/pub/a/today/2004/02/10/ioc.
htmlIoCMotivation应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它.
也可以说,依赖被注入到对象中.
所以,控制反转是,关于一个对象如何获取它所依赖的对象的引用,这个责任的反转.

*InstituteofComputerSoftwareNanjingUniversity*IoCApproachIInterfaceInjection/ContextualizedDependencyLookup(Type1)componentsimplementspecificinterfacesprovidedbytheircontainersinordertobeconfigured**importorg.
apache.
avalon.
framework.
*;publicclassJDBCDataMangerimplementsServiceable{DataSourcedataSource;publicvoidservice(ServiceManagersm)throwsServiceExceptiondataSource=(DataSource)sm.
lookup("dataSource"publicvoidgetData(usedataSourceforsomething}}Therequirementtoimplementspecificinterfacescangivecodea"bloated"feel,whileatthesametimecouplingyourapplicationcodetotheunderlyingframework.
AvalonIoCApproachIISetterInjection(Type2)someexternalmetadataisusedtoresolvedependencies.
*InstituteofComputerSoftwareNanjingUniversity*publicclassJDBCDataManger{privateDataSourcedataSource;publicvoidsetDataManager(DataSourcedataSource{this.
dataSource=dataSource;}publicvoidgetData(usedataSourceforsomething}}Lookslikeanormalbean!
SpringIoCApproachIIMetadata:takestheformofanXMLconfigurationfileinSpring.
*InstituteofComputerSoftwareNanjingUniversity*com.
mydb.
jdbc.
Driverjdbc:mydb://server:port/mydbrootMetadatacanbereusedbymultiplecomponents!
IoCApproachIIdefineaninstanceofourmanagerandpassinareferencetothedatasource*InstituteofComputerSoftwareNanjingUniversity*Makeunittesteasier!
Applicationcodeisnottiedtothecontainer.
Potentialdownsides:Componentrelationshipunclear;EncapsulationbrokenIoCApproachIIIConstructorInjection(Type3)Basedontheprincipleof"GoodCitizen"Registeranobjectwiththeframework,specifytheparameterstouse(whichcaninturnbecreatedbytheframeworkitself)andthenjustrequestaninstance.
Thecomponentsbeingregisteredjusthavetoimplementaconstructor,whichcanbeusedtoinjectthedependencies.
*InstituteofComputerSoftwareNanjingUniversity*IoCApproachIIINeedaconstructor*InstituteofComputerSoftwareNanjingUniversity*publicclassJDBCDataManger{privateDataSourcedataSource;publicJDBCDataManger(DataSourcedataSource){this.
dataSource=dataSource;}publicvoidgetData(usedataSourceforsomething}}IoCApproachIII//createadatasourcebeanBasicDataSourcedataSource=newBasicDataSource();dataSource.
setDriverClassName("com.
mydb.
jdbc.
Driver");dataSource.
setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.
setUsername("Bob");//createthecontainerMutablePicoContainerpico=newDefaultPicoContainer();//registercomponentswithcontainerConstantParameterdataSourceParam=newConstantParameter(dataSource);Stringkey="DataManager";Parameter[]params={dataSourceParam};//NoweachrequestforaDataManagerwillinstantiateaJDBCDataManagerobjectwithourdefined//dataSourceobjectpico.
registerComponentImplementation(key,JDBCDataManger.
class,params);*PicoContainerUseold-fashionedJavacodetoglueeverythingIoCApproachIIITogetinstancesoftheJDBCDataManagerobject,wejusthavetoreferencetheclassbyitskey:*InstituteofComputerSoftwareNanjingUniversity*JDBCDataMangerdm=(JDBCDataManger)pico.
getComponentInstance(key);Applicationcodeisindependentoftheframeworkitself;onlyaconstructorisneeded.
Potentialdownsides:usingconstructorstomaintainthedependenciescanbecomemorecomplexwhenusinginheritanceComparison*InstituteofComputerSoftwareNanjingUniversity*Type1从JNDI或ServiceManager等获得被调用者1.
EJB/J2EE2.
AvalonType2使用JavaBeans的setter方法1.
SpringFramework,2.
WebWork/XWorkType3在构造方法中实现依赖1.
PicoContainer,2.
HiveMind思考题:比较三种IoC方法的优缺点IoCTimeline*InstituteofComputerSoftwareNanjingUniversity*Springvs.
PicoContainerDifferentworkrequiredtosetupyourIoCbindingsSpringcanbeconfiguredeitherbyanXMLconfigurationfileordirectlyinJavaPicoContainerrequiresaJavabindingBotharefairly"lightweight"frameworkPicoContainerissmallerSpringisnotjustanIoCframework:italsoprovideswebapplicationandAOPframeworks,aswellassomegeneralsupportclasses*InstituteofComputerSoftwareNanjingUniversity*Aspect-OrientedProgrammingSeparationofConcernsCrosscuttingConcernsAspectsWeaving*InstituteofComputerSoftwareNanjingUniversity*Aspect-OrientedProgrammingComplexityofenterprisesoftwaresystemsJBoss4.
0正是使用AOP框架进行开发.
具体功能如下:Authentication权限Caching缓存Contextpassing内容传递Errorhandling错误处理Lazyloading懒加载Debugging调试logging,tracing,profilingandmonitoring记录跟踪优化校准Performanceoptimization性能优化Persistence持久化Resourcepooling资源池Synchronization同步Transactions事务*InstituteofComputerSoftwareNanjingUniversity*摘要MoreaboutPatternFramework:why,what,howComparison*InstituteofComputerSoftwareNanjingUniversity*Comparison不同的研究领域设计模式研究的是一个设计问题的解决方法框架是一个应用体系结构,是一种或多种设计模式和代码的混合体统一的思想设计可以被重用*InstituteofComputerSoftwareNanjingUniversity*Comparison设计模式比框架更抽象设计模式在每一次被复用时,都需要被实现框架不仅能被学习,还能被直接执行和复用设计模式是比框架更小的体系结构元素一个典型的框架往往包含了多个设计模式,反之不然框架比设计模式更加特例化框架总是针对一个特定的应用领域框架是OO系统获得最大复用的方式,较大的OO应用将会由多层彼此合作的框架组成*InstituteofComputerSoftwareNanjingUniversity*Comparison框架是软件,而设计模式是软件的知识体,提升框架的设计水平*InstituteofComputerSoftwareNanjingUniversity*MoreComparison框架vs.
应用系统框架vs.
工具箱,类库框架vs.
软件体系结构…*InstituteofComputerSoftwareNanjingUniversity*作业(本次作业不用提交)查询"容器(container)"的定义,谈谈你对"容器"的理解,思考"容器"和"框架"的关系结合实习项目,研究Spring中是怎么体现IoC的Ref对做课堂Presentation感兴趣的同学请发email给我,OO理论探索/学习心得/实践经验均可.

妮妮云(119元/季)日本CN2 2核2G 30M 119元/季

妮妮云的知名度应该也不用多介绍了,妮妮云旗下的云产品提供商,相比起他家其他的产品,云产品还是非常良心的,经常出了一些优惠活动,前段时间的八折活动推出了很多优质产品,近期商家秒杀活动又上线了,秒杀产品比较全面,除了ECS和轻量云,还有一些免费空间、增值代购、云数据库等,如果你是刚入行安稳做站的朋友,可以先入手一个119/元季付的ECS来起步,非常稳定。官网地址:www.niniyun.com活动专区...

hosthatch:14个数据中心15美元/年

hosthatch在做美国独立日促销,可能你会说这操作是不是晚了一个月?对,为了准备资源等,他们拖延到现在才有空,这次是针对自己全球14个数据中心的VPS。提前示警:各个数据中心的网络没有一个是针对中国直连的,都会绕道而且ping值比较高,想买的考虑清楚再说!官方网站:https://hosthatch.com所有VPS都基于KVM虚拟,支持PayPal在内的多种付款方式!芝加哥(大硬盘)VPS5...

TmhHost 全场八折优惠且充值返10% 多款CN2线路

TmhHost 商家是一家成立于2019年的国人主机品牌。目前主营的是美国VPS以及美国、香港、韩国、菲律宾的独立服务器等,其中VPS业务涵盖香港CN2、香港NTT、美国CN2回程高防、美国CN2 GIA、日本软银、韩国cn2等,均为亚太中国直连优质线路,TmhHost提供全中文界面,支持支付宝付款。 TmhHost黑五优惠活动发布了,全场云服务器、独立服务器提供8折,另有充值返现、特价服务器促销...

依赖注入为你推荐
伪装微信地理位置用软件 伪装微信地理位置 在相册上传图片显示所在城市还是我目前的位置?yy频道中心yy频道怎么进频道中心,求图~!百度抢票浏览器猎豹浏览器,360抢票,百度卫士抢票哪个抢票工具好?彩信中心移动的彩信中心是?主页是?收不到彩信,怎么设置?xp系统停止服务XP系统停止服务后怎么办?bluestack安卓模拟器bluestacks怎么用?系统分析员考系统分析员有什么好处?铁路客服中心铁路客户服务中心怎么订票blogcnblogcn的博客可以搬家到哪些网站?防钓鱼如何防钓鱼子线缠绕主线
网站备案域名查询 已经备案域名 cpanel主机 vmsnap3 koss 一点优惠网 警告本网站 国外在线代理 铁通流量查询 qq数据库下载 世界测速 100mbps 东莞服务器 国外ip加速器 创建邮箱 太原联通测速 中国linux 中国联通宽带测速 登陆qq空间 石家庄服务器 更多