आरक्रैवेन्स में कुछ उत्कृष्ट अंतर्दृष्टि हैं। मैं यह दिखाना चाहता हूं कि आप उनके सुझावों को कैसे कार्यान्वित कर सकते हैं।
यह डेटा का उपयोग वर्ग के लिए एक इंटरफेस को परिभाषित करने को लागू करने के द्वारा शुरू करने के लिए अच्छा होगा:
public interface IPostRepository
{
IEnumerable<Post> GetMostRecentPosts(int blogId);
}
फिर एक डेटा वर्ग को लागू। इकाई फ्रेमवर्क संदर्भों को बनाने के लिए सस्ते हैं, और जब आप उनका निपटान नहीं करते हैं तो आप असंगत व्यवहार प्राप्त कर सकते हैं, इसलिए मुझे लगता है कि आप जो डेटा चाहते हैं उसे खींचने के लिए आमतौर पर बेहतर होता है, और उसके बाद संदर्भ का निपटान करते हैं।
public class PostRepository : IPostRepository
{
public IEnumerable<Post> GetMostRecentPosts(int blogId)
{
// A using statement makes sure the context is disposed quickly.
using(var context = new BlogContext())
{
return context.Posts
.Where(p => p.UserId == userId)
.OrderByDescending(p => p.TimeStamp)
.Take(10)
// ToList ensures the values are in memory before disposing the context
.ToList();
}
}
}
अब आप अपने नियंत्रक एक निर्माता तर्क के रूप में इन खजाने में से एक को स्वीकार कर सकते हैं: तो आपको लगता है कि निर्दिष्ट कर सकते हैं,
public class BlogController : Controller
{
private IPostRepository _postRepository;
public BlogController(IPostRepository postRepository)
{
_postRepository = postRepository;
}
public ActionResult Index(int blogId)
{
var posts = _postRepository.GetMostRecentPosts(blogId);
var model = new PostsModel { Posts = posts };
if(!posts.Any()) {model.Message = "This blog doesn't have any posts yet";}
return View("Posts", model);
}
}
MVC आप डिफ़ॉल्ट के एवज में अपने स्वयं के नियंत्रक फैक्टरी का उपयोग करने की अनुमति देता है अपने आईओसी निनजेक्ट की तरह ढांचा तय करता है कि नियंत्रक कैसे बनाए जाते हैं। आप यह जानने के लिए अपना इंजेक्शन ढांचा सेट अप कर सकते हैं कि जब आप किसी IPostRepository के लिए पूछते हैं तो उसे PostRepository ऑब्जेक्ट बनाना चाहिए।
इस दृष्टिकोण का एक बड़ा लाभ यह है कि यह आपके नियंत्रक इकाई-परीक्षण योग्य बनाता है। उदाहरण के लिए, आप सुनिश्चित करें कि आपके मॉडल जब कोई पोस्ट कर रहे हैं एक संदेश हो जाता है बनाना चाहते हैं, तो आप Moq की तरह एक मजाक रूपरेखा एक परिदृश्य स्थापित करने के लिए उपयोग कर सकते हैं, जहां अपने भंडार रिटर्न कोई पोस्ट:
var repositoryMock = new Mock<IPostRepository>();
repositoryMock.Setup(r => r.GetMostRecentPosts(1))
.Returns(Enumerable.Empty<Post>());
var controller = new BlogController(repositoryMock.Object);
var result = (ViewResult)controller.Index(1);
Assert.IsFalse(string.IsNullOrEmpty(result.Model.Message));
यह बनाता है अपने डेटाबेस को स्थापित करने की आवश्यकता के बिना या उस तरह के विशेष कुछ भी सेट किए बिना, आपके नियंत्रक कार्यों से अपेक्षित विशिष्ट व्यवहार का परीक्षण करना आसान है। इस तरह के यूनिट परीक्षण लिखना आसान है, निर्धारिती (उनकी पास/विफल स्थिति कोड पर आधारित है, डेटाबेस सामग्री नहीं है), और तेज़ (आप अक्सर इनमें से एक हजार में एक सेकंड चला सकते हैं)।
क्या आपको केवल एक नियंत्रक के लिए इस ऑब्जेक्ट की आवश्यकता है? –
हो सकता है कि आपको निजी स्थिर उदाहरण के साथ सिंगलटन पटर का उपयोग करना चाहिए और आलसी लोडिंग उदाहरण के लिए संपत्ति प्राप्त करें। –