5

मैं वर्तमान में एक परियोजना पर ASP.NET MVC ढांचे का उपयोग कर रहा (काफी मेरी पहली बार)मेरा सीआरयूडी LINQ कोड कहां जाता है? ASP.NET MVC

.. मैं अपने डेटा मॉडल के रूप में उपयोग कर रहा हूँ Linq2SQL

मैं कहाँ इस तरह का होना चाहिए कोड की:

var entries = from e in db.sometable select e; 

मैं वर्तमान में इस थोड़े नियंत्रक में कोड है और डेटा मैं दृश्य में मिल पारित ..

यह ठीक है?

यदि मैं इस प्रकार के कोड को शामिल करने के लिए अपने linq2sql डेटामॉडल में कैसे शामिल नहीं हूं?

धन्यवाद

डैनियल

उत्तर

2

यह MVC के लिए भंडार पैटर्न का उपयोग करने के लिए आम बात है। आमतौर पर, आप एक इंटरफेस को परिभाषित करते हैं, उदाहरण के लिए, प्रोडक्ट्स, और फिर, आप इस इंटरफेस को कार्यान्वित करते हैं, जो आपको linq2sql कोड कहते हैं। आपका नियंत्रक इस इंटरफ़ेस को कन्स्ट्रक्टर के पैरामीटर के रूप में स्वीकार करेगा, ताकि यह इस इंटरफ़ेस पर निर्भर करता हो, न कि ठोस वर्ग पर। एक निर्भरता इंजेक्टर का उपयोग करना, जैसे कि निनजेक्ट, आपको कन्स्ट्रक्टर को ठोस इंटरफ़ेस कार्यान्वयन की अनुमति देगा। यह आपके वेब ऐप पर यूनिट परीक्षण को सक्षम बनाता है, और लचीलापन भी जोड़ता है।

वास्तव में एक अच्छी किताब है, प्रो एएसपी.नेट एमवीसी 2 फ्रेमवर्क, जो कि सभी को बताती है। मैं वर्तमान में इसे पढ़ रहा हूं, और मुझे बस यह पसंद है।

0

नियंत्रक विधियों में लिंक प्रश्न पूछना ठीक है।

अगर हम चिंताओं को अलग करने के बारे में बात कर रहे हैं, तो विचार यह है कि आपकी डेटा परत (इस मामले में, भंडार (?) कोड जो आपको db.sometable के साथ आपूर्ति करता है) आपके तर्क कोड (इस मामले में नियंत्रक विधियों) को डीक्यूल करता है डेटास्टोर।

डेटाबेस के बजाए आप डेटा परत से पूछताछ करते हैं, तो आप अंतर्निहित डेटास्टोर बदल सकते हैं और आपका नियंत्रक कोड अभी भी काम करेगा।

कुछ लोग तर्क देंगे कि जितना अधिक तर्क कोड उतना बेहतर होगा जितना आप नियंत्रकों से बाहर कर सकते हैं और अपने मॉडल कोड में देख सकते हैं (the first answer here देखें), लेकिन यह निर्भर करता है कि आप कितना दूर जाना चाहते हैं।

0

यहाँ कैसे यह करने के लिए repository pattern

इसके अलावा लागू करने के लिए मैं अपने अनुप्रयोगों के व्यापार तर्क को संभालने और

5

को जोड़ने के लिए क्या @Poco कहा, यहाँ है हल्के अपने नियंत्रकों रखने के लिए एक अतिरिक्त परत लागू करेगा का एक उदाहरण है एक उदाहरण:

Foo.Common.Repositories में (Foo.Common परियोजना के अंदर):

public interface IRepository<T> 
{ 
    IEnumerable<T> GetAll(); 
    void Update(T entity); 
    void Add(T entity); 
    void Delete(T entity); 
    void Save(); 
} 

public interface IUserRepository : IRepository<User> 
{ 
    void GetByCredentials(string username, string password); 
} 

अंदर Foo.Data.Repositories (Foo.Data अंदर परियोजना):

public class UserRepository 
{ 
    // ... other methods/properties snipped. 

    public IEnumerable<User> GetAll() 
    { 
     // Where this.Users would be L2Sql or Code-First... or some other ORM. 
     return from u in this.Users orderby u.Name select u; 
    } 
} 
फिर अपने वास्तविक Foo.Web अंदर

:

public class UserController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public UserController(IUserRepository userRepository) 
    { 
     this.userRepository = userRepository; 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult List() 
    { 
     var users = this.userRepository.GetAll(); 
     return this.View(users); 
    } 
} 

और अपने अंदर Global.asax आप IUserRepository हल करने Ninject या कुछ अन्य आईओसी कंटेनर होगा:

public static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IUserRepository>().To<UserRepository>(); 
} 

protected void Application_Start() 
{ 
    var kernel = new StandardKernel(); 

    AreaRegistration.RegisterAllAreas(); 

    MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters); 
    MvcApplication.RegisterRoutes(RouteTable.Routes); 
    MvcApplication.RegisterServices(kernel); 

    // I'm using MVC3 here: 
    DependencyResolver.SetResolver(new NinjectResolver(kernel)); 
}