3

CastleWindsorにを使用して作成されたオブジェクトの依存関係を解決させる方法を理解しようとしています Activator.CreateInstance

現在、この方法でオブジェクトを作成すると、作成されたオブジェクト内の依存関係が解決されません。依存関係を解決しながら同じことを行うWindsorメソッドがあるかどうかを調べてみましたが、これまでのところ何も見つかりませんでした。

このようにインスタンスを作成する理由については、基本的なテキストゲームを少し楽しんでいます。インスタンスはユーザー入力コマンドに基づいて作成されているため、文字列に基づいてインスタンスを作成する必要があります(現在、コマンドはディクショナリでタイプにマップされており、上記の方法を使用して作成されます)。

助けてくれてありがとう。

4

3 に答える 3

2

私の知る限り、キャッスルウィンザーに登録するか、いわゆる「名前付きインスタンス」を登録できるため、IoCを確実に実行できないActivator.CreateInstanceを処理せずに、コンテナーを介してそれらを解決することにより、必要なオブジェクトを作成できます。基本的に、キーを使用してコンポーネントを登録する必要があります。

AddComponent(String key, Type classType) 

そして電話する

Resolve(string Key)

すべての依存関係を解決して、コンポーネントを適切に作成し直します。

于 2011-02-06T21:11:17.390 に答える
2

Felice からの回答を拡張するには、受け入れられた回答に基づいて解決策を投稿すると便利だと思いました。

現在、私のコマンドは 経由でマッピングされていますが、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
                };
}
于 2011-02-06T22:21:14.203 に答える
1

ウィンザー的には、より良い実装は、型付きファクトリを利用することです。型付きファクトリでは、ファクトリの実装が自動的に作成されるため、コードでコンテナを参照する必要はありません。

型付きファクトリを使用すると、ファクトリは次のようになります。

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

Windsor は、各ファクトリ メソッドを対応するリゾルブに転送します。たとえばGetMove、 になりcontainer.Resolve<IUserInputCommand>("Move")ます。

詳細については、型付きファクトリ ドキュメント (「get」メソッドの名前による検索)を参照してください。

これはウィンザーが本当に輝いている場所の1つだと思います:)

于 2011-02-07T08:50:29.520 に答える