2011-02-16 23 views
7

İstek listesi bittikten sonra structuremap DataContext'i atacağından emin olmak istedim. İşteStructuremap DataContext nesnesinin atılması

oto benim datacontext elden veya i elle Dispose çağırmak gerekiyor StructureMap Will benim kurulum

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

mi ??

cevap

4

Yuvalanmış kaplar kullanmıyorsanız ve içerik örneğini taşıyan kabı atın. Bunu elden çıkarmak için bağlamın yaratıcısına kalmış. İçerik oluşturucu genellikle kodunuzun ObjectContext.GetInstance<MyDataContext> kodunu veya StructureMap'in bir DataContext'i nesnelerinizden birine enjekte etmesini sağlayan kök yöntemi olacaktır.

Yaygın bir uygulama, HttpRequest başına bir bağlam oluşturmak ve içeriği isteğin sonunda atmaktır.

+0

Teşekkürler. Cevap kabul edildi. –

9
işim bu

:

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

ve ...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScoped zaman HttpContext mevcut kullanır.

YapıMap her şeye bakıyor, o zaman. Sınıflarınızda IDisposable'u uyguladığınızı unutmayın.

+0

HybridHttpOrThreadLocalScoped kullanarak SM'de ThreadLocal depolamasını kullanacak olsa da, ReleaseAndDisposeAllHttpScopedObjects çağrısı bir istisna atar. ThreadLocal'da saklanan nesneleri nasıl attığınızı nasıl anlatabilir misiniz? – Roman

+0

@Am: HybridHttpOrThreadLocalScoped kullanamazsınız HttpContextLifecycle üyesidir. ThreadLocalStorageLifecycle (ilgilendiğiniz) olanının EjectAll adlı bir yöntemi olduğunu gördüm. Bunu hiç kullanmadım, düşünmedim ve asla bu işe karışmadım. – LeftyX