我正在使用 Ninject 实例化一些带有构造函数参数的对象,例如:
class MyClass
{
public MyClass(string myArg)
{
this.myArg = myArg;
}
}
我需要这个类的实例数直到运行时才知道,但我想做的是确保每个变体都会myArg
产生不同的单例实例(因此两次请求相同的值会返回相同的实例,但不同args 返回不同的实例)。
有谁知道这样做的好方法,最好是内置的方法?
我发现一篇为旧版本的 Ninject How To Ensure One Instance per Variation of Activation Parameters编写的文章,但希望新版本有一个更简洁的解决方案。
编辑
这是我所采用的,改编自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();
}