Замок Виндзор: Как передать аргументы командной строки нескольким службам? - PullRequest
1 голос
/ 05 августа 2011

Я хочу передать аргументы командной строки (т. Е. 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 не устраивает? А важнее? Как я могу это сделать?

PS. Я хочу использовать FromAssembly для вызова моих Установщиков, поэтому передача параметров конструктора в него невозможна (afaik).

1 Ответ

2 голосов
/ 05 апреля 2012

Ошибка выдает, потому что у вас есть два параметра конструктора в Service, строковый массив и IRole. Но при создании экземпляра сервиса вы передаете только один аргумент. Вам следует позвонить, как показано ниже.

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

...