ciao,
Davide_Sangalli ha scritto:
non ho capito dove devo fare la new DBContext,
Non devi :) Ci pensa Ninject a crearti le istanze del DBContext e dei repository. Idealmente, non dovrai mai più usare la parola chiave new, ma sarà Ninject a darti le istanze.
Riprendiamo l'esempio di questo repository:
public class ClienteRepository : IClienteRepository {
public ClienteRepository(MioDbContext contesto){...}
}
Vedi che non ha costruttori senza parametri, ma ha un solo costruttore che accetta un MioDbContext. Disegnando il repository così, esponi correttamente la sua dipendenza da un MioDbContext. Cioè, rendi evidente che ne ha bisogno per poter funzionare, un po' come una lavatrice a gettoni che se non ci metti prima dentro soldi e detersivo non potrà erogare il servizio (<- "lavare").
Tu devi soltanto aggiungere i bindings nella funzione RegisterServices.
kernel.Bind<IClienteRepository>().To<ClienteRepository>();
kernel.Bind<MioDbContext>().ToSelf().InRequestScope();
Come dicevo nel post precedente, il metodo .InRequestScope() farà in modo che il MioDbContext iniettato nei vari repository sarà sempre lo stesso (almeno finché si resta all'interno della stessa richiesta web), consentendoti così di realizzare il pattern Unit of Work.
Ora il repository e i suoi contesti non resta che usarli. Come ottenere un riferimento ad essi? Potresti farteli dare direttamente da Ninject, usando il metodo .Get<T>() del kernel ma siccome immagino che lo stai usando come
DependencyResolver di MVC3, puoi sfruttare la stessa tecnica che abbiamo visto prima, ovvero creare un costruttore nel tuo Controller che accetti come parametri tutto quello che ti serve per lavorare.
public class ClienteController : Controller
{
MioDbContext _contesto;
IClienteRepository _repoCliente;
//questo è il costruttore del tuo controller
//contesto e repository ti vengono passati da ninject, non devi più usare new!
public ClienteController(MioDbContext contesto, IClienteRepository repoCliente)
{
_contesto = contesto;
_repoCliente = repoCliente;
}
//questa è una tua ipotetica action "Create"
[HttpPost]
public ActionResult Create(Cliente cliente)
{
//uso la referenza al repository per aggiungere il cliente
_repoCliente.Add(cliente);
//salvo il contesto
_contesto.SaveChanges();
}
}
Ora, questo che vedi è un esempio banale che non si avvicina al tuo caso reale, ma è solo per dimostrare come Ninject possa iniettare istanze nei costruttori.
EDIT: negli esempi ho usato l'implementazione concreta del contesto (MioDbContext), forse incorrettamente, infatti avrei dovuto astrarlo usando la sua classe base (DBContext), o un'interfaccia. Dipende da cosa devi realizzare.
ciao
Modificato da BrightSoul il 18 febbraio 2012 15.05 -