Ho una classe con dipendenze che ho cablato con Ninject.Nascondere la creazione del kernel all'interno di una libreria di classi
public interface IFoo {}
public class MyObject {
[Inject]
IFoo myfoo;
}
In attuazione reale che sto utilizzando l'iniezione di proprietà, ma solo per illustrare in modo rapido, io iniettare sul campo. Mi pare di capire, invece di istanze Newing di MyObject, al fine di ottenere le dipendenze per essere adeguatamente iniettato, ho bisogno di usare
kernel.Get<MyObject>()
La cosa che sto inciampando però è che MyObject sarà usato solo nel contesto di una libreria di classi. L'intenzione è per le applicazioni finali di creare i propri moduli e passarli in un'istanza del kernel per idratare. Detto questo, quale è in genere il modo più pragmatico di affrontare l'affioramento di un'istanza generica di un kernel di Ninject nella mia libreria di classi in modo che le istanze di MyObject (e altri casi simili) possano essere idratate?
La mia prima inclinazione è una sorta di factory che internalizza un kernel singleton - che le applicazioni stesse devono idratare/inizializzare caricando un modulo.
Quindi, in RandomService.cs
var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();
Prima di andare troppo lontano su questa strada, però, ho bisogno di fare un controllo di integrità per assicurarsi che il pensiero è suono o che non ci sia qualche altra evidente cosa che mi manca Sono ovviamente nuovo di IoC e mi sento come se fossi alle basi, ma non necessariamente il modo migliore di usarlo.
Fortunatamente, questo è un lib interno (in senso aziendale) quindi ho un pubblico in cattività - altri sviluppatori del mio team, utilizzando uno strumento standard. Ora, ogni dev può avere legami diversi che desidera, da qui la mia originaria quandry. Re: ctor vs prop injection, l'elica sembra avere un sacco di cose da scrivere, ma mi preoccupo che la lista delle dipendenze cresca nel tempo e quindi le chiamate dei ctor. Ci sono altri svantaggi per puntellare l'iniezione che dovrei cercare? – bakasan
Anche con un'app interna, continuerei a seguire gli stessi principi che portano a un codice più pulito con una migliore separazione delle preoccupazioni. Ci sono molti potenziali problemi con Property Injection, tra cui la protezione degli invarianti (è la dipendenza null?), Eventualmente lo swapping a caldo della dipendenza iniettata (probabilmente non qualcosa che si vuole fare) e una API più vaga in generale. –
Oh, e solo per essere esplicito ed esplicito al riguardo: considero Service Locator un anti-pattern: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –