che sto usando Ninject istanziare alcuni oggetti con un arg costruttore passato, ad esempio:istanze Ninject Memoize a Singleton Ambito
class MyClass
{
public MyClass(string myArg)
{
this.myArg = myArg;
}
}
Il numero di istanze che ho bisogno di questa classe non sarà noto fino al runtime, ma quello che voglio fare è garantire che ogni variazione di myArg
abbia come risultato un'istanza singleton diversa (quindi chiedere lo stesso valore due volte restituisce la stessa istanza, ma argomenti diversi restituiscono istanze diverse).
Qualcuno sa di un buon modo, preferibilmente integrato, per farlo?
Ho trovato un articolo scritto per una versione precedente di Ninject How To Ensure One Instance per Variation of Activation Parameters ma speravo che ci sarebbe stata una soluzione più pulita per la versione più recente.
Modifica
Ecco quello che ho passato con, adattato da risposta di Akim di seguito:
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();
}
Controllare [ 'ninject.extensions.factory'] (https://github.com/ninject/ninject.extensions.factory) per implementazione automatica della fabbrica astratta – Akim