Castle.Windsor 是一种非常方便的 IOC Framework,有关细节请参考官方文档。本文仅介绍如何向构造方法注入类型和对象参数。
在下面的例子中,我们需要注入 InjectionClass 这个类型,为了方便我将它和其他类型写到一起。在注入 InjectionClass 的同时需要为这个类型提供另一个所依赖的类型 Data,Data 实现了 IData 接口。如果你为了更好地理解,可以将 InjectionClass、Data、IData 放在其他的程序集中。
1. 类型参数注入
看下面的例子你会发现注入一个类型参数是很容易的事情。
IocTest.xml
2. 对象参数注入
我们将上面的例子稍作修改就可以注入一个缺省构造的对象参数。
IocTest.xml
接下来,我们调整一下,为 Data 添加一个非默认构造方法。
IocTest.xml
好像都很简单,没什么可说的。花点时间继续研究 Castle 的源码,以后打算用 Castle Windsor + ActiveRecord(NHibernate) + Atlas 做点东西试试。
在下面的例子中,我们需要注入 InjectionClass 这个类型,为了方便我将它和其他类型写到一起。在注入 InjectionClass 的同时需要为这个类型提供另一个所依赖的类型 Data,Data 实现了 IData 接口。如果你为了更好地理解,可以将 InjectionClass、Data、IData 放在其他的程序集中。
1. 类型参数注入
看下面的例子你会发现注入一个类型参数是很容易的事情。
using System;
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(Type t)
{
if (t.GetInterface("ConsoleApplication1.IData") != null)
Console.WriteLine((Activator.CreateInstance(t) as IData).X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(Type t)
{
if (t.GetInterface("ConsoleApplication1.IData") != null)
Console.WriteLine((Activator.CreateInstance(t) as IData).X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
IocTest.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<components>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>ConsoleApplication1.Data, ConsoleApplication1</t>
</parameters>
</component>
</components>
</configuration>
<configuration>
<components>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>ConsoleApplication1.Data, ConsoleApplication1</t>
</parameters>
</component>
</components>
</configuration>
2. 对象参数注入
我们将上面的例子稍作修改就可以注入一个缺省构造的对象参数。
using System;
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(IData t)
{
Console.WriteLine(t.X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(IData t)
{
Console.WriteLine(t.X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
IocTest.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<components>
<component id="data" service="ConsoleApplication1.IData, ConsoleApplication1" type="ConsoleApplication1.Data, ConsoleApplication1">
</component>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>${data}</t>
</parameters>
</component>
</components>
</configuration>
<configuration>
<components>
<component id="data" service="ConsoleApplication1.IData, ConsoleApplication1" type="ConsoleApplication1.Data, ConsoleApplication1">
</component>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>${data}</t>
</parameters>
</component>
</components>
</configuration>
接下来,我们调整一下,为 Data 添加一个非默认构造方法。
using System;
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
public Data(int x)
{
this.x = x;
}
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(IData t)
{
Console.WriteLine(t.X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
using System.Collections.Generic;
using System.Text;
using Castle.Windsor;
using Castle.MicroKernel;
namespace ConsoleApplication1
{
public interface IData
{
int X { get; }
}
public class Data : IData
{
public Data(int x)
{
this.x = x;
}
private int x;
public int X
{
get { return x; }
}
}
public class InjectionClass
{
public InjectionClass(IData t)
{
Console.WriteLine(t.X);
}
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer provider = new WindsorContainer(@"Config/IocTest.xml");
InjectionClass test = provider["test"] as InjectionClass;
}
}
}
IocTest.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<components>
<component id="data" service="ConsoleApplication1.IData, ConsoleApplication1" type="ConsoleApplication1.Data, ConsoleApplication1">
<parameters>
<x>123456</x>
</parameters>
</component>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>${data}</t>
</parameters>
</component>
</components>
</configuration>
<configuration>
<components>
<component id="data" service="ConsoleApplication1.IData, ConsoleApplication1" type="ConsoleApplication1.Data, ConsoleApplication1">
<parameters>
<x>123456</x>
</parameters>
</component>
<component id="test" type="ConsoleApplication1.InjectionClass, ConsoleApplication1">
<parameters>
<t>${data}</t>
</parameters>
</component>
</components>
</configuration>
好像都很简单,没什么可说的。花点时间继续研究 Castle 的源码,以后打算用 Castle Windsor + ActiveRecord(NHibernate) + Atlas 做点东西试试。