2015-10-09 7 views
5

ben (değil denetleyicisi olarak) bazı yöntemlerde kullanılmak bunu için ASP NET 5/EF 7 app istek başına bir bağlam almak istiyorum.EF7 mevcut veritabanı bağlamını ASP NET 5'de denetleyiciden nasıl çözebilirim?

Ne yazık ki bu amaca ulaşmak için bazı yöntemler kullanabilir belgelerinde ASP.NET vNext template ve örnekler aspnet/MusicStore

+0

Eğer Kontrolörleri bu 'bazı methods' çağırmak mısın? İstek başına içerik alabilir ve bunu bazı yöntemlere iletebilirsiniz. – Michael

+0

rahat değil, birden fazla çağrı olabilir. MVC5 uygulamalarında PerRequestLifetimeManager ile UnityDependencyResolver kullandım. Istek başına DBContext oluşturmak orada tek isteği içinden, denetleyicinizdeki enjekte istediğiniz kadar çoklu 'bazı methods' onu geçebilir - Ben tam olarak neye ihtiyacınız O yapacak benzer bir şey burada –

+0

yapmaya çalışıyorum. Daha fazla ayrıntı için [bu blog yazısı] (http://www.jerriepelser.com/blog/resolve-dbcontext-as-interface-in-aspnet5-ioc-container) kontrol edin. – Michael

cevap

6

cevap bulamadık.

(ConfigureServices() yöntemde) Bağımlılık enjeksiyon sisteminde ApplicationDbContext kayıt için .AddDbContext<ApplicationDbContext>(); yöntem kullanarak, Scoped bağımlılığı (ya da "isteğe göre" bir deyişle) olarak kayıtlı gerçeğine yol açar. Böylece sadece Bağımlı Enjeksiyon sisteminden almanız gerekir.

  1. yapıcı yöntemi sınıfının parametresinde (hangi DBContext kullanacağız) olarak DBContext ekleyin. Öyleyse Dependency Injection sistemini kullanarak bu sınıfı almalısınız, örneğin kontrolörün yapıcısı parametresi olarak eklediniz. Eğer bağlam almak için yapıcı enjeksiyon kullanmak istemiyorsanız

    public class HabitsController : Controller 
    { 
        public HabitsController(HabitService habitService) 
        { 
    
        } 
    } 
    
    public class HabitService 
    { 
        private GetHabitsContext _dbContext; 
    
        public HabitService(GetHabitsContext dbContext) 
        { 
         _dbContext = dbContext; 
        } 
    } 
    
  2. Ama GetService() yöntemi kullanarak gerekli dependenses alabilirsiniz (ama bunu almak, aşağıdaki örnekte, bunun için ServiceProvider durumda I'am ihtiyaç kurucu enjeksiyon yoluyla da).

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below 
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above 
    public class HabitService 
    { 
        private IServiceProvider _serviceProvider; 
    
        public HabitService(IServiceProvider serviceProvider) 
        { 
         _serviceProvider = serviceProvider; 
        } 
    
        public GetHabit() 
        { 
         var dbcontext = _serviceProvider.GetService<ApplicationDbContext>(); 
        } 
    } 
    
  3. ilk yöntemde, biz (değil yapıcı enjeksiyon yoluyla) çok HabitService yöntem GetService() yoluyla alabilirsiniz. sözler için

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below 
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above 
    
    public class HabitsController : Controller 
    { 
        public HabitsController(IServiceProvider serviceProvider) 
        { 
         var habitService= serviceProvider.GetService<HabitService>(); 
        } 
    } 
    
    public class HabitService 
    { 
        private GetHabitsContext _dbContext; 
    
        public HabitService(GetHabitsContext dbContext) 
        { 
         _dbContext = dbContext; 
        } 
    } 
    

Teşekkür Tseng:

Ben senin nesneler içine kabı enjekte etmek oldukça kötü bir uygulama olduğunu, unutulmamalıdır. kap, sadece (alan/iş katmanı uygulama düzeyinde uygulanır, ve) bileşimin kök ve fabrikalar belirli tip referans alınmalıdır


HabitService içinde HabitsController ve _dbContext içinde

DBContext farklı bağlamlar!

ben kontrol

, bu aynı bağlamdır.

+0

Haklısınız, o senin nesneler içine kabı enjekte etmek oldukça kötü bir uygulama olduğunu, teşekkürler –

+1

ben unutulmamalıdır, çalışıyor.Kap sadece kompozisyon kökünden ve belirli tipteki fabrikalardan (uygulama düzeyinde uygulanmış ve etki alanı/iş katmanında uygulanmayan) referans alınmalıdır. – Tseng

+0

@Tseng Haklısınız! Cevabımı düzeliyorum. –

İlgili konular