2

Castle WindsorにActivator.CreateInstanceを使って作成されたオブジェクトの依存関係を解決させる方法を理解しようとしています。Activator.CreateInstanceを使用しているときに注入されたインスタンスを解決する

現在、このようにオブジェクトを作成すると、作成されたオブジェクト内の依存関係は解決されません。私はウィンザー法が同じことをしている間に依存関係を解決しているかどうかを調べるために検索しましたが、今まで何も見つけていません。

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

ありがとうございました。

+0

は、なぜあなたは代わりに、最初の場所でActivator.CreateInstanceを使用してのウィンザーでオブジェクトを解決しませんか? –

+0

私は今やっています。私の現在の養成については私の答えを見てください。 –

答えて

2

AFAIKあなたは城ウィンザーに登録することができます。いわゆる「名前付きインスタンス」を登録できるので、確実にIoCを実行できないActivator.CreateInstanceを処理せずに、コンテナを介して解決することで必要なオブジェクトを作成できます。

AddComponent(String key, Type classType) 

をしてから戻って適切にresovedすべての依存関係を作成したコンポーネントを持つように

Resolve(string Key) 

を呼び出す: は、基本的には、キーを使用してコンポーネントを登録する必要があります。

+0

ありがとうFelice、あなたの答えは本当に役に立ちました!私は別の答えとして私の最終的な解決策を投稿し、受け入れられた答えとしてあなたのものを設定します。助けと正しい方向へのナッジのための乾杯。 –

+0

あなたは大歓迎です! –

2

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

現在、私のコマンドはIDictionary<TKey,TValue>でマップされていますが、間もなく別のメディア(XML、JSONなど)に移動されます。

ここで私は、ユーザー入力のためのcompnentsを登録しています方法ですが、コマンド:

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

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

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

をウィンザーは、対応する解決するには、各ファクトリメソッドを転送します - 例えば:型指定された工場で

、あなたの工場では、このようになります。 GetMovecontainer.Resolve<IUserInputCommand>("Move")になります。

詳細については、typed factory docs ("'get' methods lookup by name)を参照してください。

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

+0

大変感謝しています。それは素晴らしい見えます。私は明日これをさらに見ていきます。助けを応援! –

関連する問題