【转】Castle Windsor之组件注册
【轉(zhuǎn)】Castle Windsor之組件注冊(cè)
注冊(cè)方式較多,大體有這么幾種,學(xué)習(xí)得比較粗淺,先記錄:1、逐個(gè)注冊(cè)組件
即對(duì)每個(gè)接口通過(guò)代碼指定其實(shí)現(xiàn)類(lèi),代碼:
container.Register(Component.For<IMyService>() //接口.ImplementedBy<MyService>() //實(shí)現(xiàn)類(lèi) );
典型應(yīng)用場(chǎng)景:例如定義了一個(gè)日志記錄接口,放到一個(gè)獨(dú)立程序集中。具體實(shí)現(xiàn)可能有多種方式(日志以文本文件/XML文件/數(shù)據(jù)庫(kù)等不同方式存儲(chǔ)),則可以為每個(gè)實(shí)現(xiàn)類(lèi)建立一個(gè)獨(dú)立的程序集,在各程序集中將自身注冊(cè)為接口的實(shí)現(xiàn)。這樣當(dāng)我們需要日志的某個(gè)存儲(chǔ)形式時(shí),選擇對(duì)應(yīng)的dll即可
2、按規(guī)則批量注冊(cè)
和1比較類(lèi)似,不同的是,不用逐個(gè)指定接口和實(shí)現(xiàn)類(lèi),而是指定一個(gè)規(guī)則,Windsor會(huì)用規(guī)則去匹配和注冊(cè)當(dāng)前應(yīng)用中所有程序集。代碼:
container.Register(Classes.FromThisAssembly() //當(dāng)前程序集,也可以調(diào)用其它方法,如FromAssemblyInDirectory()等.InSameNamespaceAs<RootComponent>() //與RootComponent類(lèi)具有相同的命名空間,還可以用InNamespace("Com.Spbdev")直接指定命名空間.WithService.DefaultInterfaces() .LifestyleTransient()); //生命周期
3、按程序集安裝注冊(cè)
與按照規(guī)則批量注冊(cè)類(lèi)似,差別在于每個(gè)程序集內(nèi)部自己實(shí)現(xiàn)一個(gè)IWindsorInstaller接口來(lái)定義注冊(cè)規(guī)則。也就是將注冊(cè)規(guī)則下放到程序集。
首先,需要指定對(duì)哪些程序集進(jìn)行安裝注冊(cè)(只指定對(duì)程序集的搜索規(guī)則):
container.Install(FromAssembly.InDirectory(new AssemblyFilter("Extensions")));//Extensions目錄下的所有程序集。
其次,每個(gè)程序集內(nèi)通過(guò)一個(gè)或多個(gè)實(shí)現(xiàn)了IWindsorInstaller接口的類(lèi),來(lái)定義哪些Interface和實(shí)現(xiàn)類(lèi)要注冊(cè)到容器。
如下代碼是官網(wǎng)上的一個(gè)范例:
public class RepositoriesInstaller : IWindsorInstaller {public void Install(IWindsorContainer container, IConfigurationStore store){container.Register(Classes.FromThisAssembly().Where(Component.IsInSameNamespaceAs<RepositoriesInstaller>()).WithService.DefaultInterfaces().LifestyleTransient());} }
意思是當(dāng)前程序集中,與RepositoriesInstaller具有相同命名空間的接口、實(shí)現(xiàn),都注冊(cè)到IOC容器中。
4、XML配置文件注冊(cè)
用構(gòu)造函數(shù)方式注冊(cè):
IWindsorContainer container = new WindsorContainer("dependencies.config");
或通過(guò)Install方法
container.Install(Configuration.FromXmlFile("dependencies.config"));
二、
?安裝的配置
? ? ? ? 安裝的配置比較簡(jiǎn)單,無(wú)非是尋找安裝類(lèi),并執(zhí)行安裝并獲取容器,所有的安裝類(lèi)都需要繼承自IWindsorInstaller,此接口規(guī)定了方法如下:
?
void Install(IWindsorContainer container, IConfigurationStore store) 此方法用于執(zhí)行容器里具體類(lèi)的注冊(cè),類(lèi)注冊(cè)將在下面學(xué)習(xí)。首先看看安裝的配置:?
?
WindsorContainer _container = new WindsorContainer(); _container.Install(FromAssembly.This(),//FromAssembly.Named("CastleWindsor"),//FromAssembly.Containing<ServicesInstaller>(),//FromAssembly.InDirectory(new AssemblyFilter("Extensions")),//FromAssembly.Instance(this.GetPluginAssembly()));以上用install方法的每一個(gè)參數(shù)對(duì)應(yīng)的配置均會(huì)被加載,如果即傳入了FromAssembly.This()又傳入了?FromAssembly.Named("CastleWindsor"),那么程序集CastleWindsor里的實(shí)現(xiàn)類(lèi)將會(huì)被重復(fù)注冊(cè)拋錯(cuò),所以得小心不能重復(fù)注冊(cè)相同的實(shí)現(xiàn)類(lèi)。
?
?
? ? ? ??實(shí)現(xiàn)類(lèi)的配置
? ? ? ??實(shí)現(xiàn)類(lèi)的配置多種多樣,根據(jù)實(shí)際需求可組合出不同的配置方式,以下就學(xué)習(xí)下一些常見(jiàn)的配置,高級(jí)配置可自行參考官方文檔http://docs.castleproject.org/Windsor.Fluent-Registration-API-Extensions.ashx
? ? ? ? 要想配置實(shí)現(xiàn)類(lèi)到容易必須新建一個(gè)安裝類(lèi)并在安裝類(lèi)的install方法下配置,如下:
?
<pre name="code" class="csharp"> public class ChargeInstaller : IWindsorInstaller{public void Install(IWindsorContainer container, IConfigurationStore store){//container.Register(// Component.For<IPrinter>().ImplementedBy<WenZhouPrinter>(),// Component.For<ICharge>().ImplementedBy<WenZhouCharge>());//container.Register(Classes.FromThisAssembly().InNamespace("CastleWindsor.IEntity").WithService.DefaultInterfaces());WenZhouPrinter wz = new WenZhouPrinter();container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient,Component.For<IFactory>().ImplementedBy<PrintFactory>(),Component.For<IPrinter>().UsingFactoryMethod(p => p.Resolve<IFactory>().GetPrint()),Component.For<ICharge>().ImplementedBy<WenZhouCharge>().DependsOn(Dependency.OnValue("twitterApiKey", "123")));//繼承兩個(gè)接口// container.Register(// Component.For<IUserRepository, IRepository>()// .ImplementedBy<MyRepository>()//);//簡(jiǎn)單工廠//container// .Register(// Component.For<IMyService>()// .UsingFactoryMethod(// () => MyLegacyServiceFactory.CreateMyService())// );// 泛型配置//container.Register(// Component.For(typeof(IRepository<>)// .ImplementedBy(typeof(NHRepository<>)//);//實(shí)體生命周期//container.Register(// Component.For<IMyService>()// .ImplementedBy<MyServiceImpl>()// .LifeStyle.Transient//.Named("myservice.default")// );//取先注冊(cè)的//container.Register(// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),// Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()//);//強(qiáng)制取后注冊(cè)的//container.Register(// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),// Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()//);//注冊(cè)已經(jīng)存在的//var customer = new CustomerImpl();//container.Register(// Component.For<ICustomer>().Instance(customer)// );}}?
配置中可以使用UsingFactoryMethod來(lái)將對(duì)應(yīng)的接口的工廠方法注冊(cè)到容器中,容器可通過(guò)該工廠方法獲取實(shí)現(xiàn)類(lèi),以上分別有簡(jiǎn)單工廠和工廠方法的配置。
通過(guò)DependsOn(Dependency.OnValue("twitterApiKey", "123")可向?qū)崿F(xiàn)類(lèi)的字段twitterApiKey注入”123“字符串值。
通過(guò)設(shè)置IsDefault來(lái)規(guī)定多個(gè)實(shí)現(xiàn)類(lèi)的默認(rèn)獲取過(guò)來(lái)的類(lèi)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xdot/p/7338680.html
總結(jié)
以上是生活随笔為你收集整理的【转】Castle Windsor之组件注册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ida和idr机制分析(盘符分配机制)
- 下一篇: SSH整合中,使用父action重构子类