どのように文字列でオブジェクトを作成するカスタムウィンザーアクティベータを記述するには?
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)
{
}
}
IScheduledTaskがプログラムで使用するものがわかっていますが、コンソールパラメータを使用して実行時にconcreateオブジェクトを解決してしまうという問題があります。では、どうすればいいですか? –
@the_drow:コンポーネントを通常どおり登録し、タイプ名をコンポーネント名として割り当てます。サービスタイプなしで登録することができます。 –
@Mauricio Scheffer:だからそれは人間的に行われるべきですか? –