Castle Windsor:如何将命令行参数传递给多个服务?

时间:2011-08-05 15:27:20

标签: inversion-of-control castle-windsor ioc-container

我想将命令行参数(即string [] args)传递给两个不同的服务。我尝试了很多东西,最接近的是下面的代码。

namespace CastleTest
{
  static class Program
  {
    static void Main(string [] args)
    {
      IWindsorContainer container = new WindsorContainer();
      container.Install(FromAssembly.This());
      IService srv = container.Resolve<IService>(new Hashtable {{"args", args}});
      srv.Do();
    }
  }

  public class Installer : IWindsorInstaller
  {
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
      container.Register(Component.For<IService>().ImplementedBy<Service>());
      container.Register(Component.For<IRole>().ImplementedBy<RoleService>());
    }
  }

  public interface IRole
  {
    string Role { get; }
  }

  public class RoleService : IRole
  {
    private string[] args;

    public RoleService(string[] args)
    {
      this.args = args;
    }

    public string Role { get { return args[1]; } }
  }

  public interface IService
  {
    void Do();
  }

  public class Service : IService
  {
    private readonly string[] args;
    private readonly IRole service;

    public Service(string[] args, IRole service)
    {
        this.args = args;
        this.service = service;
    }

    public void Do()
    {
        Console.WriteLine(args[0] + ": " + service.Role);
    }
  }
}

执行此操作会给出:

无法创建组件“CastleTest.RoleService”,因为它具有要满足的依赖性。 CastleTest.RoleService正在等待以下依赖项: 键(具有特定键的组件) - 没有注册的args。

这是为什么?为什么RoleService的依赖“args”不满意?更重要的是?我该怎么办?

PS。我想使用FromAssembly来调用我的安装程序,因此将构造函数params传递给它是没有选择的(afaik)。

1 个答案:

答案 0 :(得分:2)

错误是抛出,因为Service中有两个构造函数参数,一个字符串数组和IRole。但是在创建服务实例时,您只传递一个参数。你应该打电话,如下所示。

IRole roleService=container.Resolve<IRole>(new HashTable {{"args", args}}); IService srv = container.Resolve<IService>(new Hashtable {{"args", args}, {"service", roleService}});