2016-02-29 20 views
7

Attualmente sto lavorando per includere una nuova funzionalità per un sito web.Come utilizzare Iniezione delle dipendenze con Entity Framework DbContext?

Ho una classe DbContext che ho creato usando EF6.

Il sito Web utilizza un layout principale in cui vengono sottoposti a rendering i sottofinestri che vengono visualizzati in base alla pagina richiesta. Voglio usare Dependency Injection per accedere a DbContext nei Sublayouts. In generale, userei un controller per gestire le chiamate, tuttavia, voglio saltarlo in questo caso.

Inoltre, voglio mantenere l'implementazione flessibile in modo che i nuovi DbContexts vengano aggiunti. Sarò in grado di usarli facilmente.

Stavo pensando di creare un'interfaccia "IDbContext".

Avrò la nuova interfaccia (diciamo "IRatings") che implementa questa interfaccia.

Sto andando su di esso nel modo giusto?

Qualche idea?

+0

Niente di speciale 'EF' davvero. Tieni a mente che 'DbContext' è' IDisposable' quindi devi gestire la vita in qualche modo – Szer

+1

@Szer Grazie per avermelo ricordato. Sì, ne sono consapevole. Volevo solo sapere come farlo? – omkarshukla

risposta

5

Preferisco SimpleInjector ma non si differenzia molto per qualsiasi altro contenitore IoC.

Maggiori informazioni here

Esempio per ASP.Net4:

// You'll need to include the following namespaces 
using System.Web.Mvc; 
using SimpleInjector; 
using SimpleInjector.Integration.Web; 
using SimpleInjector.Integration.Web.Mvc; 

    // This is the Application_Start event from the Global.asax file. 
    protected void Application_Start() 
    { 
     // Create the container as usual. 
     var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     // Register your types, for instance: 
     container.Register<IDbContext, DbContext>(Lifestyle.Scoped); 

     // This is an extension method from the integration package. 
     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     // This is an extension method from the integration package as well. 
     container.RegisterMvcIntegratedFilterProvider(); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    } 

Tale registrazione creerà DbContext per ogni WebRequest e chiuderlo per voi. Quindi è sufficiente iniettare IDbContext nel controller e usarlo come al solito senza using:

public class HomeController : Controller 
{ 
    private readonly IDbContext _context; 

    public HomeController(IDbContext context) 
    { 
     _context = context; 
    } 

    public ActionResult Index() 
    { 
     var data = _context.GetData(); 
     return View(data); 
    } 
} 
+0

Grazie a @Szer! Questo è esattamente quello che ho fatto. Usiamo un framework MVP. Viene inizializzato nel metodo Application_Start. Ho creato una nuova classe RatingsContainerBuilder, che deriva da IInversionOfControlContainerBuilder, una classe IOC che usiamo. Nel metodo sovraccarico Build, registro il tipo con scope come InversionOfControlScope.PerHttpSessionScope. Sembra ok? – omkarshukla

+0

@omkarshukla sì, sembra buono. Sebbene non abbia funzionato con tale contenitore IoC, ma PerHttpSessionScope sembra ragionevole. Non funziona o cosa? – Szer

Problemi correlati