Part 2 – Array Configuration
Part 3 – Dictionary configuration
Array configuration
Đầu tiên là config array.Ví dụ holiday service có code như sau:
using Castle.Windsor; using Castle.Windsor.Configuration.Interpreters; using System; namespace ConsoleApp { public class HolidayService { private DateTime[] holidays; public DateTime[] Holidays { get { return holidays; } set { holidays = value; } } public bool IsHoliday(DateTime date) { if (holidays != null) { DateTime matchDate = date.Date; foreach (DateTime dt in Holidays) { if (dt.Date.Equals(matchDate)) { return true; } } } return false; } } class Program { static void Main(string[] args) { WindsorContainer container = new WindsorContainer(new XmlInterpreter()); HolidayService holidayService = container.Resolve<HolidayService>(); DateTime xmas = new DateTime(2016, 12, 25); DateTime newYears = new DateTime(2017, 1, 1); if (holidayService.IsHoliday(xmas)) { Console.WriteLine("Merry X'mas!"); } else { Console.WriteLine("X'mas is only for management!"); } if (holidayService.IsHoliday(newYears)) { Console.WriteLine("Happy new year!"); } else { Console.WriteLine("New year, you haven't done all the work for last year!"); } Console.ReadLine(); } } }Config trong App.config như sau:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <castle> <components> <component type="ConsoleApp.HolidayService, ConsoleApp"> <parameters> <holidays> <array> <item>2016-12-24</item> <item>2016-12-25</item> <item>2017-1-1</item> </array> </holidays> </parameters> </component> </components> </castle> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> </startup> </configuration>Có thể dùng <Holidays> hoặc <holidays> đều được vì Windsor đủ smart để inject. Nếu muốn resolve trực tiếp ra IList (hoặc IList, IEnumerable ... nói chung là generic collection)
static void Main(string[] args) { WindsorContainer container = new WindsorContainer(new XmlInterpreter()); var holidays = container.Resolve<IList<DateTime>>("holidays"); Console.WriteLine(string.Join("\r\n", holidays)); Console.ReadLine(); }File config tương ứng như sau:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <castle> <components> <component id="holidays" type="System.Collections.Generic.List`1[System.DateTime]"> <parameters> <collection> <array> <item>2016-12-24</item> <item>2016-12-25</item> <item>2017-1-1</item> </array> </collection> </parameters> </component> </components> </castle> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> </startup> </configuration>
Cần nhớ ở dạng config này là thực hiện theo <parameters><collection><array><item>. Nếu đầy đủ hơn thì type chỉ định có cả assembly là <component id="holidays" type="System.Collections.Generic.List`1[[System.DateTime, mscorlib]], mscorlib">.
Dictionary configuration
Tương tự như array, dictionary configuration thực hiện với <parameters><dictionary><dictionary><entry>. Ví dụ AliasService như sau:using Castle.Windsor; using Castle.Windsor.Configuration.Interpreters; using System; using System.Collections.Generic; namespace ConsoleApp { public class AliasService { private Dictionary<string, string> dict; public Dictionary<string, string> Aliases { get { return dict; } set { dict = value; } } public string Evaluate(string term) { if (dict == null) { return term; } while (dict.ContainsKey(term)) { term = dict[term]; } return term; } } class Program { static void Main(string[] args) { WindsorContainer container = new WindsorContainer(new XmlInterpreter()); AliasService aliasService = container.Resolve<AliasService>(); string sentence = "A dog ate my homework"; foreach (string word in sentence.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { Console.Write("{0} ", aliasService.Evaluate(word)); } Console.ReadLine(); } } }App.config cấu hình dictionary:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <castle> <components> <component type="ConsoleApp.AliasService, ConsoleApp"> <parameters> <Aliases> <dictionary> <entry key="dog">duck</entry> <entry key="ate">broke</entry> <entry key="homework">code</entry> </dictionary> </Aliases> </parameters> </component> </components> </castle> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> </startup> </configuration>Để resolve trực tiếp ra IDictionary
static void Main(string[] args) { WindsorContainer container = new WindsorContainer(new XmlInterpreter()); var states = container.Resolve<IDictionary<string, string>>("states"); Console.WriteLine(string.Join("\r\n", states.Keys)); Console.ReadLine(); }File config tương ứng như sau:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <castle> <components> <component id="states" type="System.Collections.Generic.Dictionary`2[System.String, System.String]"> <parameters> <dictionary> <dictionary> <entry key="VN-CT">Cần Thơ</entry> <entry key="VN-DN">Đà Nẵng</entry> <entry key="VN-HN">Hà Nội</entry> <entry key="VN-HP">Hải Phòng</entry> <entry key="VN-SG">Hồ Chí Minh</entry> </dictionary> </dictionary> </parameters> </component> </components> </castle> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> </startup> </configuration>Tới đây là xong part 2. Về type convertor có thể tham khảo thêm phần Configuration with type converters trong series của Mike Hadlow '10 Advanced Windsor tricks'.