/ / पृष्ठ गुणों में ऑब्जेक्ट्स को कैसे लोड करना है - c #, asp.net, एंटिटी-फ्रेमवर्क, डिपेंडेंसी-इंजेक्शन, प्रॉपर्टी-इंजेक्शन

पृष्ठ गुणों में ऑब्जेक्ट्स को कैसे लोड करें - c #, asp.net, एंटिटी-फ्रेमवर्क, डिपेंडेंसी-इंजेक्शन, प्रॉपर्टी-इंजेक्शन

शुरू करने के लिए, मुझे पता है कि यह किया जा सकता है लेकिन जैसा कि मैं इसे स्थापित करने या इसे लागू करने में शामिल नहीं था, मैंने यह नहीं देखा कि यह कैसे किया गया था।

एक पूर्व नौकरी में, जब मैं एक समर्थन में मदद कर रहा थावेब-एप्लिकेशन (एमवीसी या वेब-ऐप), हमारे पास आपका सामान्य ईएफ डिज़ाइन पैटर्न था। लेकिन जब ईएफ ऑब्जेक्ट्स का उपभोग करने का समय आया, तो हमें केवल पेज / कंट्रोलर में एक संपत्ति की घोषणा करनी थी और हमारे पास रिपॉजिटरी / सर्विस तक पहुंच थी।

एक खोज की घोषणा करने के लिए हमें कुछ भी करने की ज़रूरत नहीं थी var prop1 = IOC.Resolve<Type>; घोषणा के बाद, यह ऑटो आबादी वाला होगा। मैंने मान लिया कि यह निर्भरता इंजेक्शन था लेकिन इसे कैसे संभव बनाया जाए, इस पर कोई भी लेख नहीं देखा है।

कोई मदद महान होगा।

2014-04-13 को संपादित करें

इस तरह Global.asax फ़ाइल के भीतर संपत्ति इंजेक्शन करने का प्रयास किया

protected void Application_Start( object sender , EventArgs e ) {
App.Initialize( null );

if( HttpContext.Current != null ) {
var pg = base.Context.Handler as Page;
if( pg != null ) {
App.InjectProperties( pg );
}
}
}

मैंने कोशिश की है if.... तर्क Application_BeginRequest कोई सफलता नहीं है।

App.cs

public class App {
public static void Initialize( string log4netPath ) {
var container = new WindsorContainer();

container.Kernel.ComponentModelCreated += ( s => {
if( s.LifestyleType == LifestyleType.Undefined ) {
s.LifestyleType = LifestyleType.PerWebRequest;
}
} );

container.Install(
new DomainInstaller() ,
new RepositoryInstaller() ,
new ServiceInstaller()
);

container.Install( new SiteInstaller() );

if( log4netPath != null || string.IsNullOrWhiteSpace( log4netPath ) )
container.AddFacility( new LoggingFacility( LoggerImplementation.Log4net , log4netPath ) );

CWC.Init( container );
}

public static void InjectProperties( Page pg ) {
var type = pg.GetType();
foreach( var prop in type.GetProperties() ) {
if( CWC.IsInitialized ) {
try {
var obj = CWC.Resolve(prop.PropertyType);
prop.SetValue( pg , obj , null );
} catch( System.Exception ) {
//do nothing
}
}
}

}
}

DomainInstaller.cs (बहुत सारे इंस्टॉलर वर्ग इस तरह से सेटअप हैं):

public class DomainInstaller : IWindsorInstaller {
#region IWindsorInstaller Members

public void Install( Castle.Windsor.IWindsorContainer container , Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store ) {
container.Register( Types.FromAssembly( Assembly.GetExecutingAssembly() )
.Where( t => t.Namespace.StartsWith( "Woodsoft.Domain" ) )
.WithService.FirstInterface().LifestylePerWebRequest()
);
}

#endregion
}

इसलिए मुझे लगता है कि मुझे मेरी समस्या मिल सकती है, लेकिन मैं हूंसमाधान को लागू करने का तरीका अनिश्चित करें, क्योंकि मेरे पेज और मास्टरपेज दोनों में ऐसे गुण होंगे, जिन्हें मेरे EF डेटा-फ्रेमवर्क से इंजेक्ट करने की आवश्यकता होगी। नीचे एक एमवीसी कार्यान्वयन का एक उदाहरण है, लेकिन पेज और मास्टरपेज ऑब्जेक्ट में एक तत्काल सामान्य व्युत्पन्न इंटरफ़ेस नहीं है जो मैं उपयोग कर सकता हूं जैसे मैं नियंत्रकों के लिए कर सकता हूं।

एक अन्य परियोजना, एमवीसी पैटर्न:

public class SiteInstaller : IWindsorInstaller {
#region IWindsorInstaller Members

public void Install( IWindsorContainer container , IConfigurationStore store ) {
container.Register(
Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient()
);
}

#endregion
}

MVC से WebForms में इस इंस्टॉलर को संशोधित करने में कोई मदद? मास्टरपेज के इरादे को समझें और दोनों के पास ऐसे गुण हैं जिन्हें विंडसर कंटेनर से इंजेक्ट करने की आवश्यकता होगी।

उत्तर:

जवाब के लिए 0 № 1
  • आमतौर पर एमवीसी में, प्रवेश बिंदु एक नियंत्रक क्रिया है जो दृश्य प्रदान करता है।
  • डिफ़ॉल्ट रूप से, MVC फ्रेमवर्क एक कंट्रोलर क्लास को इंस्टेंट करेगा और उपयुक्त एक्शन (कंट्रोलर मेथड) को इनवाइट करेगा।
  • जब नियंत्रक को त्वरित किया जाता है, तो MVC अपनी शक्ति में सब कुछ प्रदान करने के लिए नियंत्रक की जरूरत है सब कुछ प्रदान करने की कोशिश करेगा। जैसे

अब इस MVC नियंत्रक पर विचार करें

public class MyController : Controller
{
public MyController()
{
// mvc can easily instantiate this controller
// since this is a parameter less controller.
}
}

अब इस पर विचार करें:

public class MyController : Controller
{
public MyController(IRepository repository)
{
// mvc cannot easily instantiate this controller
// unless it knows how to inject a concrete implementation
// of the IRepository interface
}
}

आमतौर पर इन्फ्रास्ट्रक्चर सेटअप के हिस्से के रूप में टीमें एमवीसी ढांचे के लिए एक निर्भरता रिवाल्वर प्रदान करती हैं।

जैसे

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

अब क्या होता है जब एमवीसी तत्काल करना चाहता हैनियंत्रक, यह एक ठोस IRepository की जरूरत है और यह भी देखता है कि यह उपयोगकर्ता द्वारा प्रदान किए गए DI फ्रेमवर्क को जिम्मेदारी सौंप सकता है। इस मामले में, ऑटोफेक।

यह "एक IRepository प्रकार प्रदान करने के लिए ऑटोफेक का अनुरोध करेगा।

और हम आमतौर पर एप्लीकेशन स्टार्ट में क्या करते हैं

ContainerBuilder builder = new ContainerBuilder();

// critical line
builder.Register(c => new EFRepository()).As<IRepository>();

IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

जैसा कि आप देख सकते हैं, जब कंट्रोलर ने इसे तुरंत लागू कर दिया है, "जादुई रूप से (अच्छी तरह से जादुई रूप से, हमने कुछ जमीनी काम किया है) IRepository प्रकार और क्रिया विधि कर सकते हैं:

var results = this.repository.GetEmployees();

कंस्ट्रक्टर के माध्यम से IRepository को कैसे इंजेक्ट किया जाता है, आप नियंत्रक की संपत्ति के माध्यम से भी इसे इंजेक्ट कर सकते हैं।

builder.Register(c => new MyType()).As<IType>().PropertiesAutowired();

अपने पेज के लिए, आप भी कर सकते हैं

builder.RegisterType<YourPageType>().PropertiesAutowired();

डीआई (ऑटोफेक यहां) स्वचालित रूप से पंजीकृत कंक्रीट प्रकार के साथ पृष्ठ की संपत्ति को आबाद करेगा।

आदि।