Castle.Windsor 类型和对象构造参数注入

Castle.Windsor 是一种非常方便的 IOC Framework,有关细节请参考官方文档。本文仅介绍如何向构造方法注入类型和对象参数。

在下面的例子中,我们需要注入 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;
    }
  }
}

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>

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;
    }
  }
}

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>

接下来,我们调整一下,为 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;
    }
  }
}

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>

好像都很简单,没什么可说的。花点时间继续研究 Castle 的源码,以后打算用 Castle Windsor + ActiveRecord(NHibernate) + Atlas 做点东西试试。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值