ich Ninject bin mit ein paar Objekte mit einem Konstruktor arg instanziiert geben, zB:Ninject Memoize Instanzen in Singleton Scope
class MyClass
{
public MyClass(string myArg)
{
this.myArg = myArg;
}
}
Die Anzahl der Instanzen I dieser Klasse müssen nicht erst zur Laufzeit bekannt sein, aber was ich tun möchte, ist sicherzustellen, dass jede Variation von myArg
zu einer anderen Singleton-Instanz führt (wenn also zweimal nach dem gleichen Wert gefragt wird, wird dieselbe Instanz zurückgegeben, aber unterschiedliche Argumente geben unterschiedliche Instanzen zurück).
Kennt jemand eine gute, vorzugsweise integrierte Methode, dies zu tun?
Ich fand einen Artikel, der für eine ältere Version von Ninject How To Ensure One Instance per Variation of Activation Parameters geschrieben wurde, aber hoffte, dass es eine sauberere Lösung für die neuere Version geben würde.
bearbeiten
Hier ist, was mit ich ging, von Akims Antwort unten angepasst:
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();
}
Check [ 'ninject.extensions.factory'] (https://github.com/ninject/ninject.extensions.factory) für automatische Implementierung der abstrakten Fabrik – Akim