एमवीसी एप्लिकेशन पर काम करने के लिए इसके कई उदाहरण हैं। यह वेब प्रपत्रों पर कैसे किया जाता है?
एमवीसी एप्लिकेशन पर काम करने के लिए इसके कई उदाहरण हैं। यह वेब प्रपत्रों पर कैसे किया जाता है?
जवाबों:
यहाँ WebForms के साथ Ninject का उपयोग करने के चरण दिए गए हैं।
चरण 1 - डाउनलोड
दो डाउनलोड आवश्यक हैं - Ninject-2.0.0.0-release-net-3.5 और WebForm एक्सटेंशन Ninject.Web_1.0.0.0_With.log4net (एक NLog विकल्प है)।
निम्न फ़ाइलों को वेब एप्लिकेशन में संदर्भित किया जाना चाहिए: Ninject.dll, Ninject.Web.dll, Ninject.Extensions.Logging.dll और Ninject.Extensions.Logging.Log4net.dll।
चरण 2 - Global.asax
ग्लोबल क्लास को कंटेनर बनाने Ninject.Web.NinjectHttpApplication
और कार्यान्वित करने की आवश्यकता है CreateKernel()
, जो कंटेनर बनाता है:
using Ninject; using Ninject.Web;
namespace Company.Web {
public class Global : NinjectHttpApplication
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new YourWebModule());
return kernel;
}
StandardKernel
निर्माता एक लेता है Module
।
चरण 3 - मॉड्यूल
मॉड्यूल, इस मामले में YourWebModule
, वेब अनुप्रयोग के लिए आवश्यक सभी बाइंडिंग को परिभाषित करता है:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public class YourWebModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ICustomerRepository>().To<CustomerRepository>();
}
इस उदाहरण में, जहाँ भी ICustomerRepository
इंटरफ़ेस संदर्भित है कंक्रीट CustomerRepository
का उपयोग किया जाएगा।
चरण 4 - पृष्ठ
एक बार ऐसा करने पर प्रत्येक पृष्ठ को इनहेरिट करने की आवश्यकता होती है Ninject.Web.PageBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public partial class Default : PageBase
{
[Inject]
public ICustomerRepository CustomerRepo { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
Customer customer = CustomerRepo.GetCustomerFor(int customerID);
}
The InjectAttribute -[Inject]
- NinRject को ICustomerRepository
CustomerRepo प्रॉपर्टी में इंजेक्ट करने के लिए कहता है ।
यदि आपके पास पहले से ही एक आधार पृष्ठ है तो आपको सिर्फ अपना आधार पृष्ठ Ninject.Web.PageBase से प्राप्त करना होगा।
चरण 5 - मास्टर पृष्ठ
अनिवार्य रूप से, आपके पास मास्टर पृष्ठ होंगे, और एक मास्टरपेज को इंजेक्ट की गई वस्तुओं तक पहुंचने की अनुमति देने के लिए आपको अपने मास्टर पृष्ठ को Ninject.Web.MasterPageBase
निम्न से प्राप्त करना होगा :
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public partial class Site : MasterPageBase
{
#region Properties
[Inject]
public IInventoryRepository InventoryRepo { get; set; }
चरण 6 - स्थैतिक वेब सेवा के तरीके
अगली समस्या स्थैतिक तरीकों में इंजेक्ट करने में सक्षम नहीं थी। हमारे पास कुछ Ajax PageMethods थे, जो स्पष्ट रूप से स्थिर हैं, इसलिए मुझे विधियों को एक मानक वेब सेवा में स्थानांतरित करना पड़ा। फिर से, वेब सेवा को निनॉज़ क्लास से प्राप्त करना होगा - Ninject.Web.WebServiceBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web.Services
{
[WebService(Namespace = "//tempuri.org/">http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class YourWebService : WebServiceBase
{
#region Properties
[Inject]
public ICountbackRepository CountbackRepo { get; set; }
#endregion
[WebMethod]
public Productivity GetProductivity(int userID)
{
CountbackService _countbackService =
new CountbackService(CountbackRepo, ListRepo, LoggerRepo);
अपने जावास्क्रिप्ट में आपको मानक सेवा का संदर्भ लेना होगा - Company.Web.Services.YourWebService.GetProductivity(user, onSuccess)
बजाय इसके PageMethods.GetProductivity(user, onSuccess)
।
एकमात्र अन्य समस्या जो मुझे मिली, वह थी उपयोगकर्ता नियंत्रण में वस्तुओं को इंजेक्ट करना। हालांकि यह संभव है कि आप अपने खुद के आधार यूजरक्रोन्ट्रोल को Ninject क्षमताओं के साथ बनाएं, मैंने यह पाया कि आवश्यक वस्तु के लिए उपयोगकर्ता नियंत्रण में प्रॉपर्टी को जोड़ना और कंटेनर पेज में प्रॉपर्टी सेट करना संभव है। मुझे लगता है कि बॉक्स से बाहर UserControls का समर्थन Ninject "टू-डू" सूची में है।
Ninject जोड़ना काफी सरल है और यह एक jectququent IoC समाधान है। बहुत से लोग इसे पसंद करते हैं क्योंकि कोई Xml कॉन्फ़िगरेशन नहीं है। इसमें अन्य उपयोगी "ट्रिक्स" हैं जैसे कि ऑब्जेक्ट्स को सिर्फ उन्नीस सिंटैक्स के साथ सिंग्लेटन्स में बदलना - Bind<ILogger>().To<WebLogger>().InSingletonScope()
। WebLogger को वास्तविक सिंगलटन इम्प्लांटेशन में बदलने की कोई आवश्यकता नहीं है, मुझे यह पसंद है।
यह Ninject v3.0 (4/12/2012 के रूप में) की रिहाई के साथ आसान हो गया है। इंजेक्शन को HttpModule के माध्यम से कार्यान्वित किया जाता है, ताकि आपके पृष्ठों को किसी कस्टम पेज / मास्टरपेज से इनहेरिट करने की आवश्यकता न हो। यहां त्वरित स्पाइक के लिए चरण (और कोड) दिए गए हैं।
NinjectWebCommon / RegisterServices
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IAmAModel>().To<Model1>();
}
चूक
public partial class _Default : System.Web.UI.Page
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine(Model.ExecuteOperation());
}
}
Site.Master
public partial class SiteMaster : System.Web.UI.MasterPage
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("From master: "
+ Model.ExecuteOperation());
}
}
मॉडल
public interface IAmAModel
{
string ExecuteOperation();
}
public class Model1 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 1";
}
}
public class Model2 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 2";
}
}
आउटपुट विंडो से परिणाम
I am a model 1
From master: I am a model 1
NinjectWeb.cs
है App_Start
। Ninject को इनिशियलाइज़ करने के लिए आपके कोड को इस फाइल में जाना होगा। यदि यह एक अलग फाइल में है (जैसे NinjectWebCommon.cs
यह काम नहीं करेगा)। यदि आप Ninject का उपयोग करके अन्य Ninject पैकेजों की तुलना में बाद में Ninject.Web स्थापित करते हैं तो यह हो सकता है।
वर्तमान में यहाँ उत्तर एक बग के कारण काम नहीं करता है । यहाँ @ जेसन के चरणों का एक संशोधित संस्करण है जिसे ग्राहक httpmodule का उपयोग करके पन्नों में इंजेक्ट किया जा सकता है और विशेषण वर्गों से विरासत में लेने की आवश्यकता के बिना नियंत्रित करता है।
InjectPageModule.cs
public class InjectPageModule : DisposableObject, IHttpModule
{
public InjectPageModule(Func<IKernel> lazyKernel)
{
this.lazyKernel = lazyKernel;
}
public void Init(HttpApplication context)
{
this.lazyKernel().Inject(context);
context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
}
private void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
var currentPage = HttpContext.Current.Handler as Page;
if (currentPage != null)
{
currentPage.InitComplete += OnPageInitComplete;
}
}
private void OnPageInitComplete(object sender, EventArgs e)
{
var currentPage = (Page)sender;
this.lazyKernel().Inject(currentPage);
this.lazyKernel().Inject(currentPage.Master);
foreach (Control c in GetControlTree(currentPage))
{
this.lazyKernel().Inject(c);
}
}
private IEnumerable<Control> GetControlTree(Control root)
{
foreach (Control child in root.Controls)
{
yield return child;
foreach (Control c in GetControlTree(child))
{
yield return c;
}
}
}
private readonly Func<IKernel> lazyKernel;
}
NinjectWebCommon / RegisterServices
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHttpModule>().To<InjectPageModule>();
kernel.Bind<IAmAModel>().To<Model1>();
}
चूक
public partial class _Default : System.Web.UI.Page
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine(Model.ExecuteOperation());
}
}
Site.Master
public partial class SiteMaster : System.Web.UI.MasterPage
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("From master: "
+ Model.ExecuteOperation());
}
}
मॉडल
public interface IAmAModel
{
string ExecuteOperation();
}
public class Model1 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 1";
}
}
public class Model2 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 2";
}
}
आउटपुट विंडो से परिणाम
I am a model 1
From master: I am a model 1
if (currentPage.Master!=null) { this.lazyKernel().Inject(currentPage.Master); }
मुझे लगता है कि यहाँ ASP.NET वेब फ़ॉर्म पर Ninject.Web को लागू करने के चरण दिए गए हैं।
अधिक विस्तृत उदाहरण के लिए, नीचे कुछ उपयोगी लिंक दिए गए हैं:
Ninject.Web विस्तार पर एक नज़र है। यह आधारभूत संरचना https://github.com/ninject/ninject.web प्रदान करता है
स्टीव सैंडरसन (एप्रेस) द्वारा "प्रो ASP.NET MVC 2 फ्रेमवर्क, 2 संस्करण" पुस्तक की जाँच करें। लेखक डेटाबेस से जुड़ने के लिए निन्जेक्ट का उपयोग करता है। मुझे लगता है कि आप उदाहरणों का उपयोग कर सकते हैं और उन्हें अपनी आवश्यकताओं के अनुकूल बना सकते हैं।
public IGoalsService_CRUD _context { get; set; }
_Context ऑब्जेक्ट को किसी तरह से शून्य करने के लिए सेट किया जा रहा है। बाकी सेटिंग्स निम्नलिखित हैं
public partial class CreateGoal : Page
{
[Inject]
public IGoalsService_CRUD _context { get; set; }
}
ग्लोबल फ़ाइल के लिए
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new Bindings());
return kernel;
}
public class Bindings : NinjectModule
{
public override void Load()
{
Bind<goalsetterEntities>().To<goalsetterEntities>();
Bind<IGoalsService_CRUD>().To<GoalsService_CRUD>();
}
}