Ninject を使用して、渡されたコンストラクター引数でいくつかのオブジェクトをインスタンス化しています。
class MyClass
{
public MyClass(string myArg)
{
this.myArg = myArg;
}
}
このクラスに必要なインスタンスの数は実行時までわかりませんが、私がやりたいことは、各バリエーションのmyArg
結果が異なるシングルトン インスタンスになるようにすることです (同じ値を 2 回要求すると、同じインスタンスが返されますが、異なるインスタンスが返されます)。 args は異なるインスタンスを返します)。
これを行うための優れた、できれば組み込みの方法を知っている人はいますか?
古いバージョンの Ninjectのアクティベーション パラメーターのバリエーションごとに 1 つのインスタンスを確保する方法について書かれた記事を見つけましたが、新しいバージョンにはより適切なソリューションがあることを期待していました。
編集
以下のAkimの回答から改作した、私が行ったものは次のとおりです。
private readonly ConcurrentBag<string> scopeParameters = new ConcurrentBag<string>();
internal object ParameterScope(IContext context, string parameterName)
{
var param = context.Parameters.First(p => p.Name.Equals(parameterName));
var paramValue = param.GetValue(context, context.Request.Target) as string;
paramValue = string.Intern(paramValue);
if (paramValue != null && !scopeParameters.Contains(paramValue))
{
scopeParameters.Add(paramValue);
}
return paramValue;
}
public override void Load()
{
Bind<MyClass>()
.ToSelf()
.InScope(c => ParameterScope(c, "myArg"));
Bind<IMyClassFactory>()
.ToFactory();
}