2009-06-23 16 views
17

NHibernate'de oturum yönetim sıkıntılarımı anlamaya çalışan bir zaman geçiriyorum. Sorunumun birçoğunun IoC ve AOP kavramlarının bilgi eksikliğinden kaynaklandığını düşünüyorum; En azından, Fabio Maulo'nun beni yönlendirmeye devam ettiği şeyi düşünüyorum.NHibernate oturum yönetimi ve tembel yükleme

Her neyse, benim sorunum, "get" aramaları yapıp sonucu bir kılavuza bağlayan bir win form uygulamasına sahip olduğum. Bağlamadan sonra, kullanıcı bir tür "yazma" eylemi gerçekleştirebilir ve bunlar, oturumdan sonra kullanım başına kavramı kullanmanın girişimi sırasında oturumun kapanmasına neden olur. Daha sonra kullanıcı, tembel yükleme işleminin başlamasına neden olan ızgarada ilerleyebilir ve şimdi oturum kapatıldı ve bir istisna alıyorum.

Görüşlerimi oturumlarım hakkında bilgilendirmek istemiyorum, kullanıcı formu kapattığında bir KillAllSessions göndermek istemiyorum. Ayrıca, bir kullanıcı, bu yöntemle ilişkili sorunları daha da karmaşık hale getirerek, herhangi bir zamanda açık olan birden çok biçime sahip olabilir. Aslında bütün bunların "sahnelerin ardında" çalışmasını istiyorum.

Bu sebeple şu ana kadarki düşüncem tembel yükleme çağrısını engellemek ve oturumun açık olup olmadığını kontrol etmek ve tekrar açmazsa, bilgi almak ve daha sonra yeniden kapatmaktır. Ancak, söyleyebildiğim kadarıyla, bu pek de fazla değil, esasen tembel yükleme zaten böyle çalışıyor. Proxy fabrika (NHibernate.Bytecode.Castle) tarafından durdurulur ve daha sonra oturumu kullanarak verileri alır. Bu yüzden, bu aramayı gerçekten durdurmalıyım, daha sonra oturumu yeniden açtıktan sonra orijinal amaçlanan aramaya geçmeliyim. Yani bu benim fikrim.

Soruma esas olarak, her şeyden önce, bununla ilgili olarak doğru yolu bile bulmanız gerekiyor. İkincisi ise, nereden başlayacağımı bile bilmiyorum. Yöntem çağrılarını hiçbir zaman engellemedim, teoride biliyordum ama pratikte değil. Rhino Commons gibi bu türden şeyler yapan kütüphaneler olduğunu biliyorum, ancak bu fırsatı öğrenmek ve daha iyi bir programcı olmak istiyorum. AOP ve Bağlam Nesneleri'ni anlamaya çalışıyorum ama şu an bunu yapmıyorum. Bazılarınız milletten yardım edebilir mi lütfen?

+0

Yapılacak çok garip bir şey gibi görünüyor. Seans kapatıldıktan sonra atılmalıdır. Bir örnek verebilir misin? – Paco

+0

Üzgünüm, hangi kısım garip görünüyor? Bir örnek olarak, bana bu sorunu yüzleştiren olaylar dizisini vermekten başka bir şey bilmiyorum: 1. Oturum Aç 2. Verileri IList şeklinde alın 3. Bir ITyped özelini doldurun koleksiyon 4. Teyp için 5. Bağımlı bir değişiklik yapılır 6. Bu değişiklik bir oturum için sorar 7. Oturum yöneticisi onu zaten açık oturum 8 eller. Çünkü bir yazma işlevi olduğu zaman oturumu kapatır 9. Kullanıcı, temassız yüklemenin ortaya çıkmasına neden olan ızgarayı kaydırmaya başlar. 10. Oturum açılmadığı için istisna atılıyor – joshlrogers

+0

Kaydırma sırasında neden yükleme eksik oluyor? – Paco

cevap

7

Birkaç seçenek düşünebilirsiniz:

Seçenek 1: kullanıcı verileri ile etkileşime ederken açık orijinal ISession tutun ve kullanıcı bittikten sonra zaman tüm değişiklikleri uygulayabilir. Bu, bellekte çok sayıda kabul edilmeyen değişiklikler olabileceği ve diğer kullanıcıların bekleyen değişiklikleri göremeyeceği anlamına gelir.

Seçenek 2: İşlemleri iki iş birimine bölün (UOW). UOW1 sadece listeyi doldurmak için okur ve sorumludur. UOW1 ile ilişkili olan iĢletme, bir taĢıĢtırma senaryosunda olduğu gibi, tembel yükleme için izin vermek için aktif kalmaktadır. UOW2, kullanıcı düzenlemeleri için oluşturulan kısa ömürlü yeni bir ISession'dır. Bir düzenleme yapıldığında, orijinal nesne UOW1'den çıkarılır ve UOW1 veritabanından yeni bir kopyasını alır.

Seçenek 3: Her düzenleme işleminden sonra listeyi yeniden oluşturun. Bu en kolay çözümdür ve küçük veri kümeleri için uygun olabilir.

+0

James, cevabınız için teşekkürler, yine de bir sorum var. Seçenek 1 ve 2 ile, oturumun, kullanıcının uygulamayı veya formu kapattığını söyleyen Oturum Yöneticisi'ne bir Öldürme iletisi gönderirken, görünümün "alınmasından" sonra nasıl kapanırdım? – joshlrogers

+0

Yorum yapabilmek için mimariniz hakkında yeterli bilgim yok. Ancak, form kapandığında iş sınır birimine benziyor. Oturum süresinin yerel olarak yönetilmesi, yeni oturumlar oluşturmanın ötesinde sorumlulukları olan küresel bir oturum yöneticisine sahip olmaktan çok daha iyi olduğunu düşünüyorum. –

+0

Bir seçenek 2 seçeneğiyle gittim - UOW1 oturumunu açık tutarak, kullanıcının göz atmasıyla ızgaranın tembel olmasını sağlayın. Ancak düzenlemeler yapmak için bireysel oturumları yönetmek çok zordu. Josh'un veriye her erişildiğinde tembel bir yüke hizmet vermek için anında bir oturum oluşturma fikrini gerçekten çok seviyorum. –

2

Benzer bir uygulama üzerinde çalışıyorum. Açık tuttuğum bir seans kullanıyorum.

Veritabanına her yazdığımda, temel oturumu kapatmayan başlat/işlem işlemini kullanıyorum. İşlem devam ederken veritabanı bağlantısı sadece NHibernate tarafından açık.

Kullanıcı formunu aktif olarak kullanırken oturumu kapatmanız için bir nedeniniz var mı?

Oturumunuzu, havuz kalıbı, vb. Yönetmek için ne kullandığınız hakkında daha fazla bilgi verebilir misiniz?

+0

Görüşümü, DAL'imin veya çalışmalarının herhangi birinin farkında olmamak için tutmaya çalışıyorum. Bu konuya gelmeden önce oturumum tek bir desenle yönetiliyordu. – joshlrogers

+0

Oturumum/depolarım StructureMap aracılığıyla oluşturuyorum ve yalnızca model bunları kullanıyor. Benim görüşüm, sebattan habersiz. – Maggie

+0

Uygulamanın ömrü boyunca bir oturum açık tutmakla ilgili tehlikelerin bulunduğunu unutmayın. Performans tek bir oturumda yüzlerce öğeyi yüklerseniz, özellikle güncelleştirmelerle kötü şekilde zarar görebilir. –

İlgili konular