मैं अपने सिर को दिनों के साथ इस पर टक्कर लगी हूं और अभी भी यह तय नहीं कर सकता कि सही दृष्टिकोण कौन सा है।
यह सवाल WPF
विशेष रूप से के बाद से के रूप में एक वेब आवेदन का विरोध, कई पोस्ट और लेख ऑनलाइन को लक्षित एक context
प्रति view-model
दृष्टिकोण और नहीं एक context
request
प्रति की सिफारिश की है।
मेरे पास WPF MVVM
एप्लिकेशन है जो Entity-Framework DB first
मॉडल का उपयोग कर रहा है।डब्ल्यूपीएफ एमवीवीएम अनुप्रयोग में डीबीकॉन्टेक्स्ट प्रबंधित करना
public partial class User
{
public User()
{
this.Role = new HashSet<Role>();
}
public string ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Role> Role { get; set; }
}
public class Role
{
public Role()
{
this.User = new HashSet<User>();
}
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<User> User { get; set; }
}
मैं कैसे निम्नलिखित को यह संभाल करने पर मेरे विकल्प संकुचित किया है::
1)
यहाँ (EF
डिजाइनर द्वारा बनाई गई) मेरे एप्लिकेशन में इस्तेमाल किया दो मॉडल का एक उदाहरण है
public class Dal
{
public User GetUserById(object userId)
{
using (var db = new DbEntities())
{
return db.User.Find(userId);
db.SaveChanges();
}
}
public void RemoveUser(User userToRemove)
{
using (var db = new DbEntities())
{
db.User.Remove(userToRemove);
db.SaveChanges();
}
}
}
जो मैं अपने 01 में उपयोग कर सकते हैं: जो बनाता है और प्रत्येक विधि कॉल पर DbContext
के disposes एक DataAccess
वर्ग बनानाइस प्रकार है:
public class UserManagerViewModel : ObservableObject
{
private readonly Dal dal = new Dal();
// models...
//commands...
}
2) इसी प्रकार 1 दृष्टिकोण लेकिन Using
बयान के बिना:
public class Dal : IDisposable
{
private readonly DbEntities db = new DbEntities();
public User GetUserById(object userId)
{
return db.User.Find(userId);
db.SaveChanges();
}
public void RemoveUser(User userToRemove)
{
db.User.Remove(userToRemove);
db.SaveChanges();
}
public void Dispose()
{
db.SaveChanges();
}
}
उपयोग अंदर ViewModel
3) ही है बनाएँ प्रत्येक entity
के लिए repository
। उपर्युक्त विकल्पों के समान दिखता है (using
दुविधा के साथ या उसके बिना), हालांकि प्रत्येक संग्रह में केवल entity
से संबंधित विधियां हैं।
अफैक का उपयोग मेरे ViewModel
के अंदर जैसा ही है।
public class UnitOfWork : IDisposable
{
private DbEntities db = new DbEntities();
private IUserRepository userRepository;
public IUserRepository UserRepository
{
get
{
return userRepository ?? new UsersRepository(db);
}
}
public void Save()
{
db.SaveChanges();
}
public void Dispose()
{
db.Dispose();
}
}
और मेरे ViewModel
अंदर इसका इस्तेमाल इस प्रकार है::
4) एक Unit-Of-Work
वर्ग कि मांग पर उचित Repository
पारित करेंगे बनाएं
public class UserManagerViewModel : ObservableObject
{
private readonly UnitOfWork unit = new UnitOfWork();
// models...
//commands...
}
ऊपर दृष्टिकोण से कौन सा (यदि कोई है) डेटा समेकन, बेहतर अमूर्तता और लेयरिंग और समग्र प्रदर्शन के संदर्भ में प्राथमिकता दी जाती है?
संपादित करें -this article. में निम्नलिखित पैरा मिला:
जब विंडोज प्रस्तुति फाउंडेशन (WPF) या Windows प्रपत्र के साथ काम करने, प्रपत्र प्रति एक संदर्भ उदाहरण का उपयोग करें। यह आपको परिवर्तन-ट्रैकिंग कार्यक्षमता का उपयोग करने देता है जो संदर्भ प्रदान करता है।
हालांकि, यह की कि मैं अपने view-model
में एक DbContext
वस्तु बनाना चाहिए प्रश्न उठाता है या यह बेहतर मेरी DAL
वर्ग के रूप में एक उपयोगिता वर्ग इस तरह के है और यह संदर्भ के लिए है।
ईएफ में एक उत्कृष्ट यूओडब्ल्यू (संदर्भ) + भंडार (डीबीसेट) है। अपना खुद का निर्माण क्यों करें? शायद ही कभी इन अतिरिक्त परतों सहायक हैं। वे डेटा-केंद्रित अनुप्रयोगों का नेतृत्व करते हैं जो व्यापारिक तर्क को क्लाइंट में खींचते हैं क्योंकि कार्य-केंद्रित अनुप्रयोगों के विपरीत जो ईएफ मॉडल के करीब सेवाओं में उपयोग मामलों को समाहित करते हैं। यह डेटा बनाम अमूर्त कार्यों का सार है (जहां अमूर्त मतलब है दृढ़ता कार्यान्वयन छिपाना)। –
यह देखें http://mehdi.me/ambient-dbcontext-in-ef6/ – ErikEJ
@GertArnold आपके उत्तर के लिए धन्यवाद। चूंकि मैं विशेष रूप से 'डब्ल्यूपीएफ एमवीवीएम' के बारे में पूछ रहा हूं, मुझे आश्चर्य है कि लंबे समय तक रहने वाले 'डीबीकॉन्टेक्स्ट' का उपयोग किया जाना चाहिए (एक 'संदर्भ' प्रति 'दृश्य-मॉडल') या क्या मुझे अपने 'संदर्भ' के जीवन काल को सीमित करना चाहिए विकल्प 1 ('उपयोग' का उपयोग करके :)) – Yoav