Разрешение внедренных экземпляров при использовании Activator.CreateInstance - PullRequest
2 голосов
/ 06 февраля 2011

Я пытаюсь выяснить, как заставить Castle Windsor разрешать зависимости для объектов, созданных с использованием Activator.CreateInstance.

В настоящее время, когда я создаю объекты таким способом, зависимости внутри созданного объекта не разрешаются. У меня был поиск, чтобы выяснить, есть ли метод Виндзора, который делает то же самое, в то же время решая зависимости, но я до сих пор ничего не нашел.

Что касается того, почему я создаю экземпляры таким образом, я немного поиграю с основной текстовой игрой, и экземпляры создаются на основе пользовательских команд ввода, и поэтому мне нужно создать экземпляр на основе строка (в настоящее время команда отображается в Словаре на тип, который затем создается с использованием вышеуказанного метода).

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Чтобы расширить ответ, данный Феличе, я подумал, что было бы полезно опубликовать решение, к которому я пришел, основываясь на принятом ответе.

В настоящее время мои команды отображаются через IDictionary<TKey,TValue>, но скоро будут перемещены на другой носитель (XML, JSON и т. Д.).

Вот как я регистрирую компоненты для пользовательских команд ввода:

public void InstallUserCommands(IWindsorContainer container)
{

  var commandToClassMappings = new Dictionary<string, string>
                            {
                              {"move", "MoveCommand"},
                              {"locate","LocateSelfCommand"},
                              {"lookaround","LookAroundCommand"},
                              {"bag","LookInBagCommand"}
                            };

  foreach (var command in commandToClassMappings)
  {
     var commandType = Type.GetType("TheGrid.Commands.UserInputCommands." + command.Value);
     container.Register(Component.For(commandType).Named(command.Key));

  }
}

и для разрешения экземпляра:

public UserCommandInputMapperResponse Invoke(UserCommandInputMapperRequest request)
{
  var container = new WindsorContainer();
  container.Install(FromAssembly.This());

  IUserInputCommand instance;

  try
  {
    instance = container.Resolve<IUserInputCommand>(request.CommandName.ToLower().Trim());
  }
  catch (Exception)
  {
     instance = null;
   }

   return new UserCommandInputMapperResponse
                {
                   CommandInstance = instance
                };
}
2 голосов
/ 07 февраля 2011

AFAIK, вы можете зарегистрироваться в замке Виндзор, вы можете зарегистрировать так называемые «именованные экземпляры», чтобы вы могли создать нужный объект, разрешая их через контейнер, не имея дело с Activator.CreateInstance, который наверняка не может выполнить IoC.По сути, вам нужно зарегистрировать свой компонент с ключом:

AddComponent(String key, Type classType) 

, а затем вызвать

Resolve(string Key)

, чтобы вернуть ваш компонент должным образом и восстановить все зависимости.

1 голос
/ 07 февраля 2011

Лучшей реализацией, с точки зрения виндзорского подхода, было бы использование типизированной фабрики. В случае типизированной фабрики ваш код не должен ссылаться на контейнер, потому что для вас автоматически будет создана реализация фабрики.

С типизированной фабрикой ваша фабрика может выглядеть так:

public interface IUserInputCommandFactory
{
    IUserInputCommand GetMove();
    IUserInputCommand GetLocate();
    IUserInputCommand GetLookAround();
    IUserInputCommand GetBag();
}

и Виндзор перенаправит каждый фабричный метод в соответствующее разрешение - например, GetMove станет container.Resolve<IUserInputCommand>("Move").

См. типизированные заводские документы (поиск методов get по имени) для получения дополнительной информации.

Я думаю, что это одно из мест, где Виндзор действительно сияет :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...