Oggi al lavoro un collega e ho avuto una discussione su quanto segue:
Fondamentalmente abbiamo un motore di regole che funziona nel modo seguente:
RuleExecutor
-
Ottiene tutte le regole da eseguire nel costruttore come
public RuleExecutor(ICollection<IRule> rulesToExecute) { ... }
-
Esegue tutte le regole chiamando
rule.ApplyRule();
per ogni rulesToExecute
Regole
- Fornisci il metodo ApplyRule (); che esegue la regola
Ora vogliamo che RuleExecutor sia eseguito in un cron job.
Abbiamo discusso su come recuperare un'istanza di RuleExecutor.
Penso che il "modo corretto" sia tramite l'iniezione del costruttore
public RuleCronJob(IRuleExecutor ruleExecutor) { ... }
Il mio collega desidera utilizzare un "IocFactory" che abbia un metodo statico GetInstance < & gt ;.
Quindi nel "metodo di esecuzione" del lavoro cron farebbe qualcosa come var ruleExecutor = IocFactory.GetInstance<IRuleExecutor>();
public static TType GetInstance<TType>(params Tuple<string, object>[] constructorParameters)
{
if (constructorParameters.Any())
{
var constructorArgs = new Collection<ConstructorArgument>();
foreach (var parameter in constructorParameters)
{
constructorArgs.Add(new ConstructorArgument(parameter.Item1, parameter.Item2, true));
}
return Kernel.Value.Get<TType>(constructorArgs.Cast<IParameter>().ToArray());
}
return Kernel.Value.Get<TType>();
}
Il kernel è un kernel standard di Ninject.
Penso che l'iniezione del costruttore sia migliore perché consente test più semplici (beffa) ecc. ma non posso convincerlo a usarlo perché pensa che l'IocFactory "funzioni pure così perché non usarlo" ...
- Quali sarebbero alcuni argomenti per convincerlo a utilizzare l'iniezione del costruttore invece di IocFactory?