2009-02-26 29 views
1

Geçmiş:LINQ denetim ve geçerli kullanıcı

ben insert için veritabanı denetimi yapmak gerekir bunun için bir web uygulaması var// siler güncellemeler (ve belki okur). LINQ'yi ORM'im olarak kullanıyorum. Web'de bulduğum bazı fikirleri kullanarak, ilişkili denetim tablolarına sahip olan varlıklarımı süslemek için özelliklerin bir yolunu buldum. Denetim tablosunun kendisi, geçerli kullanıcının kimliği ve adı, modifikasyon tipi, değişiklik zamanı ve işlemin başarılı olup olmadığı gibi alanlara ek olarak, aynı tabloları orijinal tabloyla aynı türlere dahil etmek zorundadır. Denetim, SubmitChanges sırasında gerçekleşir - veri içeriğim soyut ve somut uygulamada SubmitChanges'i devralıyorum ve geçersiz kıldım. Soyut veri bağlamı, DataContext'i genişleten ve geçerli kullanıcı kimliği ve adı için yer tutucuları olan bir CurrentUser özelliği ekleyen bir AbstractAuditableDataContext'den türetilmiştir. Varsayılan olarak bunlar, oturum açmış bir kullanıcının bulunmadığı durumlar için 0 ve "sistem" dir. Sözgelimi, kullanıcı masasının belirli alanlarının güncellenmesi durumunda kayıt sırasında veya oturum açıldığında. Uygulama, ASP.NET MVC kullanarak C# ile yazılmıştır.

Sorun:

benim türetilmiş veri bağlamın geçerli kullanıcı özelliği doldurmak için en iyi yolu nedir? AuditUtility'de enjekte edilen ve CurrentUser ayarlanıp ayarlanmadığını kontrol eden bir yardımcı program sınıfı oluşturmalı mıyım? Eğer bunu test etmek gerekirse, bununla karşılaşmak isterim ancak canlı uygulamada muhtemelen tembel -loading ve oturumda olsun/ayarlayın. Ya da bu işlevselliği gerçekleştirmek için veri bağlamı fabrikasını (tüm kontrolörler tarafından kullanılan) değiştirmeliyim. Birim testi sırasında zaten sahte bir fabrika kullanıyorum, bu yüzden yeni sınıflar oluşturmaya gerek kalmadı. Veya türetme fabrika dışında yapılmalı ve mevcut kullanıcı içerik oluşturma sırasında enjekte edilmelidir. Bu, "adına" denetim yapmamı sağlar.

Bunun bir şekilde öznel olduğunu anlıyorum ama katkıda bulunabileceğin herhangi bir düşünce/deneyime minnettarım.

Teşekkürler.

cevap

0

Geçerli veri içeriğini alan ve HttpContext.User.Identity içindeki geçerli kullanıcı adına karşılık gelen kullanıcı nesnesini alan bir GetAuditUser yöntemine sahip bir CurrentUserUtilityBase sınıfı oluşturmayı bitirdim. Geçerli kullanıcının kimliğini ve görünen adını ayıklamak ve bu özellikleri içeren bir AuditUser nesnesini oluşturmak ve döndürmek için bu nesneyi kullanır.

Uygulama sınıfım, veri içeriğimin bir örneğini almak için bir fabrika kullanıyor ve bu veri bağlamında temel sınıf yöntemini çağırıyor. Veri içeriğim için kullanılan fabrika yöntemleri, geçerli kullanıcı bağlamını, oluşturulduktan sonra içeriğe bağlam bağlamında enjekte etmek için kullanır.

0

DataContext'inizin (Application, Session, Request, per BusinessObject ..) kapsamı nedir? Değişirse, geçerli kullanıcıyı DataContext içinde önbelleğe almak istemeyebilirsiniz (veya oluştururken bunu). DataContext içinde, mevcut kullanıcıyı ihtiyaç duyulduğunda Oturumdan (tek yönlü veya başka bir yerden) alan bir Mülk kullanabiliyordum.

+0

Veri içeriği kapsamı eylem başına - oldukça kısa ömürlü. – tvanfosson

1

Windows veya Forms yetkisi kullanıyorsanız, HttpContext öğesinde herhangi bir şey geçmeden kontrol edebilirsiniz. Web bağlamında değilseniz, kullanıcıyı Thread'den yakalayın. Belki:

if(HttpContext.Current != null) 
{ 
    //grab the user from the HttpContext 
} 
else 
{ 
    //grab the user from the Thread 
} 
+0

Ama bu kodu nereye koyacaksınız?Veri içeriği oluşturulduğunda veya yardımcı program çalıştırıldığında her seferinde? – tvanfosson

+0

En az direnç yolu, SubmitChanges() uygulamanıza ekliyor olabilir. Bu, herhangi bir şeyi iletme ihtiyacını ortadan kaldırır ve DataContext tüketicileriniz, ayrıntılardan hoşnut kalmaz. –

1

System.Threading.Thread.CurrentPrincipal size aradığınız cevabı vermelidir.

İlgili konular