2010-11-21 7 views
1
、初期化はそのほかに発生するが、今、我々はIScheduledTaskが上depandますいくつかのコンポーネントを持っているための必要はありませんでした、今まで

どのように文字列でオブジェクトを作成するカスタムウィンザーアクティベータを記述するには?

Assembly asm = Assembly.GetEntryAssembly(); 
ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName); 

IScheduledTask task = (IScheduledTask)oh.Unwrap(); 
task.Execute(); 

は、私はクラス名をrecievesとその関数を呼び出すコンソールアプリケーションを持っていますコンストラクタインジェクションを介して。
クラスの名前と同じ名前の名前付きインスタンスを定義する方法はありますか?それは後でresolveを使ってすべての依存関係を解決しますか?私はこれを行うことができ、パラメータとして「SomeScheduledTask」を得ればそれ
は次のとおりです。

IScheduledTask task = (IScheduledTask)container.Resolve(typeName); // I know this is possible. The problem is the registration. 

私は私の問題を解決するために、このような何かを行うことができます。

container.Register(Component.For<IScheduledTask>().Named(t => t.Name).Activator<MyActivator>()) 

そして、私の活性化因子には、ような何かをこれは:

public class MyActivator : IComponentActivator 
{ 
    public object Create(CreationContext context) 
    { 
     string typeName = context.???; // How do I get the named instance name from here? 
     Assembly asm = Assembly.GetEntryAssembly(); 
     ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName); 

     IScheduledTask task = (IScheduledTask)oh.Unwrap(); 
     task.Execute(); 
    } 

    public void Destroy(object instance) 
    { 

    } 
} 

答えて

2

私が正しく理解していれば、問題はあなたが使用されますIScheduledTaskのためのどのような実装タイプ事前に知っていないということです、S oあなたはそれを普通に登録することはできません。その場合、IComponentActivatorは正しい拡張ポイントではありません。代わりにILazyComponentLoaderを試してください。

あなたはを行う場合scan and register them normally、プログラムが使用する可能性のあるものをIScheduledTaskの実装を知っています。

+0

IScheduledTaskがプログラムで使用するものがわかっていますが、コンソールパラメータを使用して実行時にconcreateオブジェクトを解決してしまうという問題があります。では、どうすればいいですか? –

+0

@the_drow:コンポーネントを通常どおり登録し、タイプ名をコンポーネント名として割り当てます。サービスタイプなしで登録することができます。 –

+0

@Mauricio Scheffer:だからそれは人間的に行われるべきですか? –

関連する問題