c# - एएसपी.नेट कोर डीआई के साथ उदाहरणों को हल करना




dependency-injection asp.net-core asp.net-core-mvc (5)

मैं ASP.NET कोर एमवीसी अंतर्निहित निर्भरता इंजेक्शन ढांचे का उपयोग कर मैन्युअल रूप से किसी प्रकार को कैसे हल करूं?

कंटेनर सेट करना काफी आसान है:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddTransient<ISomeService, SomeConcreteService>();
}

लेकिन मैं इंजेक्शन के बिना ISomeService को कैसे हल कर सकता हूं? उदाहरण के लिए, मैं यह करना चाहता हूं:

ISomeService service = services.Resolve<ISomeService>();

IServiceCollection में ऐसी कोई विधियां नहीं हैं IServiceCollection


Answers

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddDbContext<ConfigurationRepository>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("SqlConnectionString")));

    services.AddScoped<IConfigurationBL, ConfigurationBL>();
    services.AddScoped<IConfigurationRepository, ConfigurationRepository>();
}

मैन्युअल रूप से हल करने वाले उदाहरणों में IServiceProvider इंटरफ़ेस का उपयोग करना शामिल है:

Startup.ConfigureServices में निर्भरता को हल करना

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IMyService, MyService>();

    var serviceProvider = services.BuildServiceProvider();
    var service = serviceProvider.GetService<IMyService>();
}

Startup.Configure में निर्भरता को हल करना

public void Configure(
    IApplicationBuilder application,
    IServiceProvider serviceProvider)
{
    // By type.
    var service1 = (MyService)serviceProvider.GetService(typeof(MyService));

    // Using extension method.
    var service2 = serviceProvider.GetService<MyService>();

    // ...
}

रनटाइम इंजेक्शन सेवाओं का उपयोग करना

विधि पैरामीटर के रूप में कुछ प्रकार इंजेक्शन दिए जा सकते हैं:

public class Startup
{
    public Startup(
        IHostingEnvironment hostingEnvironment,
        ILoggerFactory loggerFactory)
    {
    }

    public void ConfigureServices(
        IServiceCollection services)
    {
    }

    public void Configure(
        IApplicationBuilder application,
        IHostingEnvironment hostingEnvironment,
        IServiceProvider serviceProvider,
        ILoggerFactory loggerfactory,
        IApplicationLifetime applicationLifetime)
    {
    }
}

Startup क्लास में कई विकल्प हैं।

निर्भरता इंजेक्शन
रनटाइम Startup क्लास के कन्स्ट्रक्टर में रनटाइम सेवाओं को इंजेक्ट कर सकता है, जैसे IHostingEnvironment और IServiceProvider

Configure() विधि में सेवाओं को भी इंजेक्शन दिया जा सकता है। IApplicationBuilder पैरामीटर के बाद आप मानदंडों की मनमानी मात्रा जोड़ सकते हैं। आप अपनी स्वयं की सेवाओं को इंजेक्ट भी कर सकते हैं जो ConfigureServices() सर्विसेज ConfigureServices() विधि में पंजीकृत हैं। ConfigureServices() सर्विसेज ConfigureServices() विधि हालांकि सेवाओं को इंजेक्शन देने की अनुमति नहीं देती है, यह केवल एक IServiceCollection तर्क स्वीकार करता है।

निर्भरता को मैन्युअल रूप से हल करना
यदि आप सेवाओं को मैन्युअल रूप से हल करना चाहते हैं, तो आप रनटाइम को कन्स्ट्रक्टर और Configure() विधि में IServiceProvider इंस्टेंस इंजेक्ट करने दे सकते हैं:

public Startup(IServiceProvider serviceProvider)
{
    var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}

या

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}

हालांकि, अगर आपको ConfigureServices() सर्विसेज ConfigureServices() विधि में सेवाओं को हल करने की आवश्यकता है, तो आपको एक अलग दृष्टिकोण की आवश्यकता है। आप किसी IServiceCollection इंस्टेंस से एक इंटरमीडिएट IServiceProvider बना सकते हैं जिसमें तब तक पंजीकृत सेवाएं शामिल हैं:

public void ConfigureService(IServiceCollection services)
{
    services.AddSingleton<ISomeService, SomeService>();

    // Build the intermediate service provider
    var sp = services.BuildServiceProvider();
    var service = sp.GetService<ISomeService>();
}

इसके लिए आपको Microsoft.Extensions.DependencyInjection पैकेज की आवश्यकता है।


यदि आप टेम्पलेट के साथ एक एप्लिकेशन जेनरेट करते हैं तो Startup क्लास पर ऐसा कुछ होगा:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);

    services.AddMvc();
}

फिर आप वहां निर्भरता जोड़ सकते हैं, उदाहरण के लिए:

services.AddTransient<ITestService, TestService>();

यदि आप अपने नियंत्रक पर ITestService तक ITestService चाहते हैं तो आप ITestService पर IServiceProvider जोड़ सकते हैं और इसे इंजेक्शन दिया जाएगा:

public HomeController(IServiceProvider serviceProvider)

फिर आप जो सेवा जोड़ते हैं उसे हल कर सकते हैं:

var service = serviceProvider.GetService<ITestService>();

ध्यान दें कि सामान्य संस्करण का उपयोग करने के लिए आपको एक्सटेंशन के साथ नामस्थान शामिल करना होगा:

using Microsoft.Extensions.DependencyInjection;

ITestService.cs

public interface ITestService
{
    int GenerateRandom();
}

TestService.cs

public class TestService : ITestService
{
    public int GenerateRandom()
    {
        return 4;
    }
}

Startup.cs (कॉन्फ़िगर सर्विसेज)

public void ConfigureServices(IServiceCollection services)
{
    services.AddApplicationInsightsTelemetry(Configuration);
    services.AddMvc();

    services.AddTransient<ITestService, TestService>();
}

HomeController.cs

using Microsoft.Extensions.DependencyInjection;

namespace Core.Controllers
{
    public class HomeController : Controller
    {
        public HomeController(IServiceProvider serviceProvider)
        {
            var service = serviceProvider.GetService<ITestService>();
            int rnd = service.GenerateRandom();
        }

उपयोग:

<Button Height="100" Width="100">
  <StackPanel>
    <Image Source="img.jpg" />
    <TextBlock Text="Blabla" />
  </StackPanel>
</Button>

यह काम करना चाहिए। लेकिन याद रखें कि आपके पास अपनी परियोजना पर संसाधन में एक छवि शामिल होनी चाहिए!





c# dependency-injection asp.net-core asp.net-core-mvc