10

मेरे पास निम्न कार्यान्वयन है:क्लास लाइब्रेरी प्रोजेक्ट में ऑटोफैक का उपयोग कैसे करें?

private INewsRepository newsRepository; 

public NewsService(INewsRepository newsRepository) 
{ 
    this.newsRepository = newsRepository; 
} 

यह सेवा मेरी वेब प्रोजेक्ट की तुलना में एक अलग परियोजना में है। मैं निर्भरता इंजेक्शन कहां और कैसे निर्दिष्ट करूं? क्या मुझे अभी भी इसे अपनी global.asax फ़ाइल में रखना होगा? क्या होगा यदि इस सेवा का उपयोग मेरे अन्य ऐप्स भी किया जाता है?

उत्तर

18

आप केवल आवेदन की जड़ से कंटेनर का उल्लेख होना चाहिए (global.asax)। इसे Register Resolve Release pattern के रूप में जाना जाता है।

निर्माता इंजेक्शन का आपका सही उपयोग सुनिश्चित करता है कि आप की आवश्यकता होती है कि उन अन्य अनुप्रयोगों के लिए एक विशेष डि कंटेनर (या किसी भी सब पर) का उपयोग बिना अन्य अनुप्रयोगों से NewsService वर्ग का पुन: उपयोग कर सकते हैं।

यह designing the service in a DI Friendly manner पर एक अच्छी शुरुआत है, फिर भी इसे कंटेनर अज्ञेय रखते हुए।

2

मुझे लगता है कि यह इस पर निर्भर करेगा कि आप एकाधिक होस्ट अनुप्रयोगों में एक ही असेंबली का उपयोग करना चाहते हैं या नहीं। क्या असेंबली को वास्तव में ऑटोफैक के संदर्भों की आवश्यकता है? मैं इसके खिलाफ अनुशंसा करता हूं, जैसे कि आपकी आवश्यकताएं बाद में बदलती हैं, आपके पास अनावश्यक संदर्भों का भार होगा। आपके मेजबान एप्लिकेशन को मॉड्यूलर भागों को इकट्ठा करने के तरीके को नियंत्रित करना चाहिए, इसलिए मैं आपके होस्ट पर कॉन्फ़िगरेशन छोड़ दूंगा (इस मामले में आपका वेब एप्लिकेशन। यदि आप पंजीकरण के कुछ नियंत्रण को धक्का देना चाहते हैं, तो आप एक प्रकार का निर्माण कर सकते हैं जो आपके लिए पंजीकरण को संभालता है , लेकिन जैसा कि मैंने पहले उल्लेख किया, अपने विधानसभा अनिवार्य रूप से उपयोग करने के लिए बाध्य है AutoFac जैसे:

public static class NewsRegistration() 
{ 
    public static void RegisterTypes(ContainerBuilder builder) 
    { 
     // Register your specific types here. 
     builder.RegisterType<NewsService>().As<INewsService>(); 
    } 
} 

इस तरह आप आसानी से कह सकते हैं:

var builder = new ContainerBuilder(); 
// Register common types here? 

NewsRegistration.RegisterTypes(builder); 

var container = builder.Build(); 
2
[TestClass] 
public class LogTest 
{ 
    /// <summary> 
    /// Test project: autofac impl. 
    /// </summary> 
    private readonly ContainerBuilder _builder; 
    private readonly IContainer _container; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="LogTest" /> class. 
    /// </summary> 
    public LogTest() 
    { 
     // 
     // Read autofac setup from the project we are testing 
     // 
     _builder = new ContainerBuilder(); 
     Register.RegisterTypes(_builder); 
     _container = _builder.Build(); 

     loggingService = _container.Resolve<ILoggingService>(new NamedParameter("theType", this)); 
    } 

    [TestMethod] 
    public void DebugMsgNoExectption() 
    { 
     var a = _container.Resolve<IHurraService>(); 
     var b = a.ItsMyBirthday(); 

public class HurraService : IHurraService 
{ 
    private IHurraClass _hurra; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="HurraService" /> class. 
    /// </summary> 
    public HurraService(IHurraClass hurra) 
    { 
     _hurra = hurra; 
    } 

    /// <summary> 
    /// It my birthday. 
    /// </summary> 
    public string ItsMyBirthday() 
    { 
     return _hurra.Hurra(); 
    } 
} 

public static class Register 
{ 
    public static void RegisterTypes(ContainerBuilder builder) 
    { 
     builder.RegisterType<LoggingService>().As<ILoggingService>(); 
     builder.RegisterType<HurraService>().As<IHurraService>(); 
     builder.RegisterType<HurraClass>().As<IHurraClass>(); 
    } 
} 

कक्षा पुस्तकालय के अंदर मैंने "रजिस्टर" कक्षा बनाई। यहां ऑटोफैक सेटअप किया गया है। मेरी परीक्षा परियोजना में मैंने इस फ़ाइल को पढ़ा (रजिस्टर। रजिस्ट्रार टाइप) और _container init।

अब मेरे पास परीक्षण की जा रही परियोजना के अंदर सभी उपहारों को हल करने के लिए उपयोग है।

संबंधित मुद्दे