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'.









