上篇已經學習了Windsor的快速入門,框架的配置只需要兩步,本篇學習下這個兩步配置針對特定場景的自定義的配置,我只學習了代碼的配置,對於XML的配置可以參考官方文檔http://docs.castleproject.org/Windsor.XML-Registration-Reference.ashx。
安裝的配置
安裝的配置比較簡單,無非是尋找安裝類,並執行安裝並獲取容器,所有的安裝類都需要繼承自IWindsorInstaller,此接口規定了方法如下:
void Install(IWindsorContainer container, IConfigurationStore store)
此方法用於執行容器裏具體類的註冊,類註冊將在下面學習。首先看看安裝的配置:
WindsorContainer _container = new WindsorContainer();
_container.Install(
FromAssembly.This(),
//FromAssembly.Named("CastleWindsor"),
//FromAssembly.Containing<ServicesInstaller>(),
//FromAssembly.InDirectory(new AssemblyFilter("Extensions")),
//FromAssembly.Instance(this.GetPluginAssembly())
);
以上用install方法的每一個參數對應的配置均會被加載,如果即傳入了FromAssembly.This()又傳入了 FromAssembly.Named("CastleWindsor"),那麼程序集CastleWindsor裏的實現類將會被重複註冊拋錯,所以得小心不能重複註冊相同的實現類。
實現類的配置
實現類的配置多種多樣,根據實際需求可組合出不同的配置方式,以下就學習下一些常見的配置,高級配置可自行參考官方文檔http://docs.castleproject.org/Windsor.Fluent-Registration-API-Extensions.ashx
要想配置實現類到容易必須新建一個安裝類並在安裝類的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"))
);
//繼承兩個接口
// container.Register(
// Component.For<IUserRepository, IRepository>()
// .ImplementedBy<MyRepository>()
//);
//簡單工廠
//container
// .Register(
// Component.For<IMyService>()
// .UsingFactoryMethod(
// () => MyLegacyServiceFactory.CreateMyService())
// );
// 泛型配置
//container.Register(
// Component.For(typeof(IRepository<>)
// .ImplementedBy(typeof(NHRepository<>)
//);
//實體生命週期
//container.Register(
// Component.For<IMyService>()
// .ImplementedBy<MyServiceImpl>()
// .LifeStyle.Transient
//.Named("myservice.default")
// );
//取先註冊的
//container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()
//);
//強制取後註冊的
//container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()
//);
//註冊已經存在的
//var customer = new CustomerImpl();
//container.Register(
// Component.For<ICustomer>().Instance(customer)
// );
}
}
配置中可以使用UsingFactoryMethod來將對應的接口的工廠方法註冊到容器中,容器可通過該工廠方法獲取實現類,以上分別有簡單工廠和工廠方法的配置。
通過DependsOn(Dependency.OnValue("twitterApiKey", "123")可向實現類的字段twitterApiKey注入”123“字符串值。
通過設置IsDefault來規定多個實現類的默認獲取過來的類。