2016-02-29 22 views
7

Obecnie pracuję nad włączeniem nowej funkcjonalności dla witryny.Jak korzystać z iniekcji zależności przy użyciu Entity Framework DbContext?

Mam klasę DbContext, którą utworzyłem przy użyciu EF6.

Strona korzysta z układu głównego, w którym renderowanie podrzędności jest renderowane w zależności od żądanej strony. Chcę użyć Dependency Injection, aby uzyskać dostęp do DbContext w Sublayouts. Ogólnie rzecz biorąc, używałbym kontrolera do obsługi połączeń, ale w tym przypadku chcę go pominąć.

Ponadto, chcę zachować elastyczność wdrożenia, aby nowe DbContexts zostały dodane, będę mógł z nich łatwo korzystać.

Myślałem o stworzeniu interfejsu "IDbContext".

Będę miał nowy interfejs (powiedzmy "IRatings") implementujący ten interfejs.

Czy podążam tą drogą we właściwy sposób?

Jakieś myśli?

+0

nic szczególnego 'EF' naprawdę. Pamiętaj tylko, że 'DbContext' jest' IDisposable', więc musisz zarządzać czasem w jakiś sposób – Szer

+1

@ Szer Thanks for przypominając mi. Tak, jestem tego świadomy. Chciałem tylko wiedzieć, jak to zrobić? – omkarshukla

Odpowiedz

5

Preferuję SimpleInjector, ale nie będzie się tak różnił dla żadnego innego pojemnika IoC.

Więcej informacji here

Przykład 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)); 
    } 

Taka rejestracja stworzy DbContext za każdym WebRequest i zamknąć go dla Ciebie. Więc wystarczy wstrzyknąć IDbContext w kontrolerze i używać go jak zwykle bez 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

Thanks @ Szer! Dokładnie to zrobiłem. Używamy ram MVP. Zostaje zainicjalizowany w metodzie Application_Start. Utworzono nową klasę RatingsContainerBuilder, która pochodzi z IInversionOfControlContainerBuilder, klasy IOC, z której korzystamy. W przypadku metody Overloaded Build należy zarejestrować typ z zakresem jako InversionOfControlScope.PerHttpSessionScope. Czy to wydaje się w porządku? – omkarshukla

+0

@omkarshukla yep, wydaje się w porządku. Chociaż nie pracowałem z takim kontenerem IoC, ale PerHttpSessionScope wydaje się rozsądny. To nie działa lub co? – Szer

Powiązane problemy