2016-11-29 17 views
10

क्या एंटिटी फ्रेमवर्क 6 के कॉन्फ़िगरेशन क्लास में निर्भरता इंजेक्ट करना संभव है?निर्भरता फ्रेमवर्क बीज विधि में निर्भरता इंजेक्शन?

उदाहरण के लिए, इस तरह:

public partial class InitialMigration : DbMigration 
{   
    private readonly ILogger _logger; 

    public InitialMigration(ILogger logger) 
    {    
     this._logger = logger; 
    } 

    public override void Up() 
    { 
     CreateTable(...); 
    } 

    public override void Down() 
    { 
     DropTable(...); 
    } 
} 

कहाँ डि आरंभीकरण है इकाई की रूपरेखा 6 में होता है परिभाषित करने के लिए:

internal sealed class Configuration : DbMigrationsConfiguration<MyBaseContext> 
{ 
    private readonly ILogger _logger; 

    public Configuration(ILogger logger) 
    { 
     this._logger = logger; 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(Home.DAL.Data.HomeBaseContext context) 
    { 
     //log something 
    } 
} 

या अधिक सामान्य दृष्टिकोण संभावना प्राप्त करने के लिए कोड भी अंदर माइग्रेशन इंजेक्षन करने के लिए है उन बाइंडिंग्स?

अद्यतन

इम मैं क्या इस्तेमाल करना चाहिए के बारे में पूछ नहीं। वर्तमान में, मैं निनजेक्ट का उपयोग कर रहा हूं लेकिन यह सवाल से बाहर है, क्योंकि जो भी मैं उपयोग करता हूं, मैं प्रवासीताओं को प्रवासीता के निर्माण में इंजेक्ट करने में सक्षम होना चाहिए। Courser अगर आप कुछ लिखते हैं जैसे मैंने ऊपर लिखा है तो यह आपको "कोई डिफ़ॉल्ट कन्स्ट्रक्टर" के बारे में अपवाद नहीं देगा।

उपरोक्त उदाहरण में इलॉगर निर्भरता का एक साधारण उदाहरण है। यदि आपके पास IGeneratorService है जो कुछ डेटा उत्पन्न करेगी और आप बीज विधि के लिए डेटा जेनरेट करने के लिए इस सेवा का उपयोग करना चाहते हैं तो चीजें बदतर हो जाएंगी।

+0

DI प्रारंभिकरण आपके DI ढांचे द्वारा संभाला जाना चाहिए। –

+0

इस प्रश्न के किसी भी हिस्से को यह उत्तर कैसे दिया जाता है? – eocron

+0

क्या आपने किसी भी डीआई फ्रेमवर्क का उपयोग करने की कोशिश की है? – ColinM

उत्तर

5

इकाई फ्रेमवर्क 6 सुझाव देता है कि आप .NET Framework 4.6 या नीचे का उपयोग कर रहे हैं और .NET 4.6 या उससे नीचे के लिए अंतर्निहित कोई निर्भरता इंजेक्शन क्षमता नहीं है, इसलिए आपको स्ट्रक्चर मैप, निनजेक्ट जैसे तृतीय-पक्ष DI कंटेनर का उपयोग करना होगा, आदि। उन डी कंटेनर आपको निर्भरता इंजेक्शन प्राप्त करने के 3 तरीके देते हैं: कन्स्ट्रक्टर, सेटर या इंटरफ़ेस के माध्यम से।

मुझे पूरी तरह से यकीन नहीं है कि Configuration या InitialMigration कक्षा में निर्भरता इंजेक्शन लगाने के लिए कन्स्ट्रक्टर इंजेक्शन का उपयोग करना संभव है, लेकिन मुझे शक है। यहां तक ​​कि यदि यह संभव है, तो आप ILogger को अपने प्रश्न में वर्णित तरीके से इंजेक्ट करने में सक्षम नहीं होंगे: this._logger = logger क्योंकि ILogger को ILoggerFactory Create() विधि का उपयोग करके प्रारंभ किया गया है।

तो, मुझे नहीं लगता कि सामान्य रूप से कन्स्ट्रक्टर इंजेक्शन का उपयोग करके Configuration या InitialMigration कक्षाओं में निर्भरता को इंजेक्ट करना संभव है।

आप अपनी कक्षाओं में ILogger का उपयोग करना चाहते हैं, तो निम्न कोड के टुकड़े काम करना चाहिए:

internal sealed class Configuration : DbMigrationsConfiguration<MyBaseContext> 
{ 
    private readonly ILogger _logger; 

    public Configuration(ILoggerFactory loggerFactory) 
    { 
     this._logger = loggerFactory.Create("ConfigurationLogger"); 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(Home.DAL.Data.HomeBaseContext context) 
    { 
     //log something 
     _logger.WriteInformation("Seeding data."); 
    } 
} 

public partial class InitialMigration : DbMigration 
{   
    private readonly ILogger _logger; 

    public InitialMigration(ILoggerFactory loggerFactory) 
    {    
     this._logger = loggerFactory.Create("InitialMigrationLogger"); 
    } 

    public override void Up() 
    { 
     _logger.WriteInformation("Create table."); 
     CreateTable(...); 
    } 

    public override void Down() 
    { 
     _logger.WriteInformation("Drop table."); 
     DropTable(...); 
    } 
} 
0

मैं ऐसा नहीं सोचता। निश्चित रूप से कमांड लाइन से अद्यतन-डेटाबेस का उपयोग करने का प्रयास करते समय नहीं। याद रखें कि आपका डी कंटेनर रन टाइम पर पंजीकृत है। कहीं भी इंजेक्शन के लिए पंजीकृत कोई भी सेवा नहीं होगी। इसके अलावा ईएफ एक पैरामीटर-कम कन्स्ट्रक्टर के साथ एक विन्यास फाइल की तलाश में है। आप अपने प्रश्न से उदाहरण के साथ जल्दी से इसका परीक्षण कर सकते हैं। आपको "आपका। एस्परप्लेस" असेंबली में कोई माइग्रेशन कॉन्फ़िगरेशन प्रकार नहीं मिला।

यदि आप विशेष रूप से अपनी बीज विधि में किसी सेवा से कुछ क्रियाएं करने की सोच रहे हैं तो मैं रनटाइम एपीआई को देखने का सुझाव दूंगा जिसका जवाब here था।

मैं अपनी परियोजनाओं में एक कंसोल ऐप का उपयोग करता हूं कि मैं तैनात करते समय अपनी बिल्ड पाइपलाइन के हिस्से के रूप में आदेश भेज सकता हूं। आप आसानी से इस दृष्टिकोण का उपयोग अपने वास्तविक कोड बेस के भीतर कर सकते हैं।

private void RunMigrations() 
    { 
     Console.WriteLine("Starting migrations..."); 
     var configuration = new Configuration 
     { 
      TargetDatabase = new DbConnectionInfo(_connectionString, "System.Data.SqlClient") 
     }; 
     var dbMigrator = new DbMigrator(configuration); 
     dbMigrator.Update(); 
     Console.WriteLine("Migrations completed"); 

     //add your service here and do whatever you want. 
    } 

    private void Seed() 
    { 
     using (var MyContext = new MyContext(_connectionString)) 
     { 
      Console.WriteLine("Seeding test data into database"); 
      //this is a custom seed method 
      Initialize.Seed(_connectionString); 
      Console.WriteLine("Seeding test data is complete"); 

      //add your service here and do whatever you want. 
     } 
    } 
संबंधित मुद्दे