2010-03-14 7 views
5

Benim web uygulaması çözümü 3 projeden oluşmaktadır Database Layer'daki Entity Framework tarafından oluşturulan DataContext'un ömrünü yönetmek için Ninject'i kullanmak istiyorum.Bağımlılık Enjeksiyon ne kadar uzaklıktadır?</p> <ol> <li>Web Uygulaması (ASP.NET MVC)</li> <li>İş Mantığı Katmanı (Sınıf Kitaplığı)</li> <li>Veritabanı Katmanı (Varlık Framework)</li> </ol> <p>:

İş Mantığı katmanı, depoları (veritabanı katmanında bulunur) referans veren sınıflardan oluşur ve ASP.NET MVC uygulamasında, kod çalıştırmak için iş mantığı katmanının hizmet sınıflarına başvurulur. Her depo Web'den uzun bağımlılık zincirinin rağmen MyDataContext ömrünü işlemek

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public MyRepository 
    { 
      this.repos = new MyRepository(); 
    } 

    // do stuff with the repos 
} 

Will Ninject

public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository 
    { 
     this.db = new MyDataContext(); 
    } 

    // methods 
} 

İş Mantığı Sınıflar

Varlık Çerçeve

Repository MyDataContext nesnesinin bir örneğini oluşturur Veri Katmanı için App?

cevap

3

DÜZENLEME

Bir süre önce onunla bazı sorunlar vardır ama şimdi iş gibi görünüyor: Eğer OnePerRequestBehavior kullanabilir ve bunun ilgilenir,

Bind<CamelTrapEntities>().To<CamelTrapEntities>().Using<OnePerRequestBehavior>(); 

yerine HttpModule'ü kullanmanın mevcut istekte bağlamı ele alma.

DÜZENLEME çok HttpModule'ü bağlı olduğundan, web.config'de kayıtlı olması gerekiyor OnePerRequestBehavior 2

:

IIS6 içinde

: IIS7 ile

<system.web> 
    <httpModules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </httpModules> 
</system.web> 

:

<system.webServer> 
    <modules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </modules> 
</system.webServer> 

PREVIOUS ANSWER

Gerekmediğinde içeriği elden çıkarmak sizin sorumluluğunuzdadır. ASP.NET'teki en popüler yol, istek başına bir ObjectContext'e sahip olmaktır. Ben sahip HttpModule bunu yapın:

public Repository(CamelTrapEntities ctx) 
{ 
    _ctx = ctx; 
} 
+0

demek? – jfar

+0

@jfar: Birkaç dakika önce kontrol ettim ve kernel.Get <> 'i çağırmak bana iki kez aynı isteği verdi. Daha önce problemlerin ne olduğunu tam olarak hatırlamıyorum ama bir şekilde kullanmamaya karar verdim. Bu arada yeni kaynaklar indirdim, ancak bugüne kadar kontrol etmedim, bu yüzden uygun bir şekilde düzeltildi. – LukLed

3

Sadece Autofac with the ASP.Net integration istek ömrü bahsetmek istiyorum:

Bind<CamelTrapEntities>().ToMethod(c => (CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]); 

Benim Depo yapıcı ObjectContext alır: Bu enjeksiyon kural

public class CamelTrapEntitiesHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += ApplicationBeginRequest; 
     application.EndRequest += ApplicationEndRequest; 
    } 

    private void ApplicationEndRequest(object sender, EventArgs e) 
    { 
     ((CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]).Dispose(); 
    } 

    private static void ApplicationBeginRequest(Object source, EventArgs e) 
    { 
     HttpContext.Current.Items[@"CamelTrapEntities"] = new CamelTrapEntities();    
    } 
} 

olduğunu yerleşik destek.Örnekleri RequestContainer'da çözün ve isteklerin sonunda (IDisposable uygulanıyorsa) imha edilirler.

Sen sınıfları DI olsa dost yapmalıdır:

"iş gibi görünüyor" neyi
public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository(MyDataContext context) 
    { 
     this.db = context; 
    } 

    // methods 
} 

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public BizLogicClass(MyRepository repository) 
    { 
      this.repos = repository; 
    } 

    // do stuff with the repos 
} 
İlgili konular