2

クラス名を受け取り、その関数を呼び出すコンソールアプリケーションがあります。

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

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

これまでは、それ以外に初期化を行う必要はありませんでしたが、コンストラクターの注入によってIScheduledTaskが依存するコンポーネントがいくつかあります。
クラスの同じ名前で名前付きインスタンスを定義する方法はありますか?後で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)
    {

    }
}
4

1 に答える 1

2

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

プログラムが使用する可能性のあるIScheduledTask実装がわかっている場合はそれらを通常どおりスキャンして登録します

于 2010-11-22T00:07:37.293 に答える