কনফিগার সার্ভিসগুলিতে কীভাবে বিকাশ / পর্যায় / উত্পাদন হোস্টিং পরিবেশ পাবেন


170

ConfigureServicesপ্রারম্ভকালে পদ্ধতিতে আমি কীভাবে উন্নয়ন / পর্যায় / উত্পাদন হোস্টিং পরিবেশ পেতে পারি ?

public void ConfigureServices(IServiceCollection services)
{
    // Which environment are we running under?
}

ConfigureServicesপদ্ধতি শুধুমাত্র একটি একক লাগে IServiceCollectionপ্যারামিটার।


4
কেন IHostingEnvironmentশুধু কনফিগার সার্ভিসগুলিতে ইনজেকশন দেওয়া যাবে না ? ভুল? বা কোন কারণ সম্পর্কে আমাদের সচেতন হওয়া দরকার?
সাইমন_উইভার

3
এমএসএফটি ডক্স ডকস.মাইক্রোসফটকম
en-

উত্তর:


225

আপনি এটি কনফিগার সার্ভিসগুলিতে সহজেই অ্যাক্সেস করতে পারবেন, এটি স্টার্টআপ পদ্ধতির সময় এমন কোনও প্রোপার্টে অবিরত রাখুন যা প্রথমে ডাকা হয় এবং এটি পাস হয়ে যায়, তারপরে আপনি কনফিগার সার্ভিস থেকে সম্পত্তিটি অ্যাক্সেস করতে পারবেন।

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    ...your code here...
    CurrentEnvironment = env;
}

private IHostingEnvironment CurrentEnvironment{ get; set; } 

public void ConfigureServices(IServiceCollection services)
{
    string envName = CurrentEnvironment.EnvironmentName;
    ... your code here...
}

13
দস্তাবেজগুলি অনুসারে , এই পদ্ধতিটি ব্যবহার করা উচিত নয়। পরিবর্তে আপনি ব্যবহার করা উচিত CurrentEnvironment.IsEnvironment("environmentname")
vaindil

28
বা CurrentEnvironment.IsDevelopment()/CurrentEnvironment.IsProduction()
সাইমন_উইভার

3
@ বাইন্ডিল - আপনি যে দস্তাবেজগুলিকে উল্লেখ করেছেন তা এই পদ্ধতিটি ব্যবহার করা উচিত নয় বলে উল্লেখ করে। আপনার উদাহরণটি কেবল
আচ্ছাদনকে

3
@ Coruscate5 ঠিক আছে, এটি পরিষ্কারভাবে এই পদ্ধতিটি ব্যবহার না করার কথা বলে না, তবে এটি অন্য পদ্ধতি INSTEAD ব্যবহার করার কথা বলে। এটি কার্যত একই জিনিস।
ভাইন্ডিল

8
অবহেলিত IHostingEnਵਰচার env পরিবর্তে IWebHostEn एनভিনিউশন env ব্যবহার করুন
মার্ক

56

টি এল; ডিআর

পরিবেশের নামের ASPNETCORE_ENVIRONMENTসাথে পরিবেশগত পরিবর্তনশীল সেট করুন (যেমন Production)। তারপরে দুটি কাজের মধ্যে একটি করুন:

  • উদ্বুদ্ধ IHostingEnvironmentমধ্যে Startup.cs, তাহলে সেই ব্যবহার করুন ( envচেক করতে এখানে): env.IsEnvironment("Production")। ব্যবহার করে চেক করবেন নাenv.EnvironmentName == "Production" !
  • হয় পৃথক Startupশ্রেণি বা স্বতন্ত্র Configure/ ConfigureServicesফাংশন ব্যবহার করুন। কোনও শ্রেণি বা ফাংশন যদি এই ফর্ম্যাটগুলির সাথে মেলে তবে সেগুলি সেই পরিবেশের মানক বিকল্পগুলির পরিবর্তে ব্যবহৃত হবে।
    • Startup{EnvironmentName}() (পুরো ক্লাস) || উদাহরণ:StartupProduction()
    • Configure{EnvironmentName}()|| উদাহরণ:ConfigureProduction()
    • Configure{EnvironmentName}Services()|| উদাহরণ:ConfigureProductionServices()

সম্পূর্ণ ব্যাখ্যা

.NET কোর দস্তাবেজগুলি কীভাবে এটি সম্পাদন করতে পারে তা বর্ণনা করে । আপনার ASPNETCORE_ENVIRONMENTপছন্দসই পরিবেশে সেট করা নামক পরিবেশের পরিবর্তনশীল ব্যবহার করুন , তারপরে আপনার দুটি পছন্দ আছে।

পরিবেশের নাম পরীক্ষা করুন

ডক্স থেকে :

IHostingEnvironmentসেবা পরিবেশের সঙ্গে কাজ করার জন্য কোর বিমূর্ততা প্রদান করে। এই পরিষেবাটি এএসপি.এনইটি হোস্টিং স্তর দ্বারা সরবরাহ করা হয় এবং নির্ভরতা ইনজেকশনের মাধ্যমে আপনার স্টার্টআপ যুক্তিতে ইনজেকশনের ব্যবস্থা করা যেতে পারে। ভিজ্যুয়াল স্টুডিওর এএসপি.নেট কোর ওয়েব সাইট টেম্পলেট পরিবেশ-নির্দিষ্ট কনফিগারেশন ফাইলগুলি লোড করতে (যদি উপস্থিত থাকে) এবং অ্যাপ্লিকেশনটির ত্রুটি পরিচালনার সেটিংসকে কাস্টমাইজ করতে ব্যবহার করে approach উভয় ক্ষেত্রেই, এই আচরণ কল করে বর্তমানে নিদিষ্ট পরিবেশ উল্লেখ করে এটা করা যায় EnvironmentNameবা IsEnvironmentঅনুরোধে IHostingEnvironmentউপযুক্ত পদ্ধতি মধ্যে পাস।

দ্রষ্টব্য: আসল মানটি পরীক্ষা করার প্রস্তাব দেওয়া env.EnvironmentNameহয় না !

অ্যাপ্লিকেশনটি কোনও নির্দিষ্ট পরিবেশে চলছে কিনা তা আপনার যদি পরীক্ষা করতে হয় তবে env.IsEnvironment("environmentname")এটি ব্যবহার করুন যেহেতু এটি সঠিকভাবে কেসটিকে উপেক্ষা করবে ( env.EnvironmentName == "Development"উদাহরণস্বরূপ পরীক্ষা করার পরিবর্তে )।

পৃথক ক্লাস ব্যবহার করুন

ডক্স থেকে :

যখন কোনও এএসপি.এনইটি কোর অ্যাপ্লিকেশন শুরু হয়, Startupক্লাসটি অ্যাপ্লিকেশনটি বুটস্ট্র্যাপ করতে, এর কনফিগারেশন সেটিংস লোড করা ইত্যাদিতে ব্যবহৃত হয় ( এএসপি.নেট স্টার্টআপ সম্পর্কে আরও জানুন )। তবে, যদি কোনও শ্রেণীর নাম দেওয়া হয় Startup{EnvironmentName}(উদাহরণস্বরূপ StartupDevelopment), এবং ASPNETCORE_ENVIRONMENTপরিবেশ পরিবর্তনশীল সেই নামের সাথে মেলে, তবে Startupপরিবর্তে সেই শ্রেণিটি ব্যবহৃত হবে। সুতরাং, আপনি Startupবিকাশের জন্য কনফিগার করতে পারেন , তবে StartupProductionঅ্যাপ্লিকেশনটি উত্পাদন চলাকালীন ব্যবহৃত হবে এমন একটি পৃথক রয়েছে । অথবা উলটা.

Startupবর্তমান পরিবেশের উপর ভিত্তি করে সম্পূর্ণ পৃথক শ্রেণি ব্যবহারের পাশাপাশি আপনি কীভাবে কোনও Startupশ্রেণীর মধ্যে অ্যাপ্লিকেশনটি কনফিগার করা হয়েছে তার সামঞ্জস্যও করতে পারেন । Configure()এবং ConfigureServices()পদ্ধতি অনুরূপ পরিবেশ-নির্দিষ্ট সংস্করণ সমর্থন Startupবর্গ নিজে ফর্মের Configure{EnvironmentName}()এবং Configure{EnvironmentName}Services()। আপনি যদি কোনও পদ্ধতি সংজ্ঞায়িত করেন তবে পরিবেশটি যখন বিকাশের দিকে সেট হয় তার ConfigureDevelopment()পরিবর্তে এটি ডাকা হবে Configure()। একইভাবে, একই পরিবেশের ConfigureDevelopmentServices()পরিবর্তে কল করা হবে ConfigureServices()


29

ইন .NET Core 2.0MVC অ্যাপ্লিকেশন / Microsoft.AspNetCore.Allv2.0.0, আপনি পরিবেশগত নির্দিষ্ট প্রারম্ভে শ্রেণী হিসেবে @vaindil দ্বারা বর্ণিত থাকতে পারে তবে আমার ধরনটা পছন্দ করি না।

এছাড়াও আপনি উদ্বুদ্ধ করতে পারেন IHostingEnvironmentমধ্যে StartUpকন্সট্রাকটর। আপনার Programক্লাসে পরিবেশ পরিবর্তনশীল সংরক্ষণ করার দরকার নেই ।

public class Startup
{
    private readonly IHostingEnvironment _currentEnvironment;
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        _currentEnvironment = env;
        Configuration = configuration;
    }

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

        services.AddMvc(config =>
        {
            // Requiring authenticated users on the site globally
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));

            // Validate anti-forgery token globally
            config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

            // If it's Production, enable HTTPS
            if (_currentEnvironment.IsProduction())      // <------
            {
                config.Filters.Add(new RequireHttpsAttribute());
            }            
        });

        ......
    }
}


এন্ড্রে পোস্ট করা ইংরাজী
অহং

1
অবহেলিত IHostingEnਵਰচার env পরিবর্তে IWebHostEn वातावरण এনভির জন্য ব্যবহার করুন
মার্ক

21

এটি কোনও অতিরিক্ত বৈশিষ্ট্য বা পদ্ধতির পরামিতি ছাড়াই সম্পন্ন করা যায়:

public void ConfigureServices(IServiceCollection services)
{
    IServiceProvider serviceProvider = services.BuildServiceProvider();
    IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();

    if (env.IsProduction()) DoSomethingDifferentHere();
}

2
সর্বকালের সেরা উত্তর। থ্যানএক্স
শ্যাডি শেরিফ

7
এটি নেট কোর 3.0.০ এ নিম্নলিখিত সতর্কতাটি ছুঁড়েছে: অ্যাপ্লিকেশন কোড থেকে 'বিল্ডস সার্ভিসপ্রোভাডার' কল করা ফলাফল সিঙ্গলটন পরিষেবাদিগুলির একটি অতিরিক্ত অনুলিপি তৈরি হওয়ার ফলস্বরূপ। 'কনফিগার' করার প্যারামিটার হিসাবে নির্ভরতা ইনজেকশন পরিষেবাগুলির বিকল্পগুলি বিবেচনা করুন।
শাশ্বত 21

2
অবহেলিত IHostingEnਵਰচার env পরিবর্তে IWebHostEn वातावरण এনভির জন্য ব্যবহার করুন
মার্ক

19

যদি আপনার কোডবেসে আইওহস্টিং পরিবেশে সহজে অ্যাক্সেস না পাওয়া যায় এমন কোথাও এটি পরীক্ষা করে দেখার দরকার হয় তবে এটির আর একটি সহজ উপায় হ'ল:

bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";

ভাল, সংক্ষিপ্ত উপায়! ভেরিয়েবলের নামটি "এসপ নেট কোর" এবং "এসপ নেট" এর মধ্যে আলাদা বলে মনে রাখবেন
এনএমড্যাট

15

ডক্স প্রতি

কনফিগার করুন এবং কনফিগারেশন সার্ভিসগুলি পরিবেশের নির্দিষ্ট সংস্করণগুলি {পরিবেশনাম N এবং কনফিগার করুন {এনভায়রনমেন্ট} পরিষেবাদি:

আপনি এরকম কিছু করতে পারেন ...

public void ConfigureProductionServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for production
    services.Configure();
}

public void ConfigureDevelopmentServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for development
    services.Configure();
}

public void ConfigureStagingServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for staging
    services.Configure();
}

private void ConfigureCommonServices(IServiceCollection services)
{
    //Services common to each environment
}


11

আমি আমার একটি পরিষেবাতে পরিবেশ পেতে চেয়েছিলাম। এটা করা সত্যিই সহজ! আমি এটিকে কেবল এটির মতো নির্মাণকারীর কাছে ইঞ্জেকশন দিয়েছি:

    private readonly IHostingEnvironment _hostingEnvironment;

    public MyEmailService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

এখন পরে কোডে আমি এটি করতে পারি:

if (_hostingEnvironment.IsProduction()) {
    // really send the email.
}
else {
    // send the email to the test queue.
}

সম্পাদনা করুন:

উপরের কোডটি নেট কোর 2 এর জন্য version সংস্করণ 3 এর জন্য আপনি ব্যবহার করতে চাইবেন IWebHostEnvironment


5

হোস্টিং এনভায়রনমেন্টটি ASPNET_ENV এনভায়রনমেন্ট ভেরিয়েবল থেকে আসে, যা IHostingEn वातावरण ব্যবহার করে স্টার্টআপ চলাকালীন উপলব্ধ। হয় আপনার প্রারম্ভকালে যা প্রয়োজন তা সংরক্ষণ করুন (), বা কনফিগার সার্ভিসেস কল:

var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");

IHostingEnvironmentপাওয়া যায় না ConfigureServices
মুহাম্মদ রেহান সা Saeedদ

1
না এইটা না. কীভাবে এটি মোকাবেলা করতে হবে সে সম্পর্কে আমার উত্তরে ফিরে দেখুন।
জেফ ডানলপ

8
পরিবেশের পরিবর্তনশীল এখন "ASPNETCORE_ENVIRONMENT"
অ্যান্টনি

প্রত্যাখ্যানিত IHostingEn পরিবেশের env পরিবর্তে IWebHostEn वातावरण এনভির জন্য ব্যবহার করুন
মার্ক

5

কেবল ক্ষেত্রে যদি কেউ এটির দিকেও তাকাচ্ছে। । নেট কোর 3+ এর মধ্যে বেশিরভাগটি অপ্রচলিত। আপডেট উপায়টি হ'ল:

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env,
    ILogger<Startup> logger)
{
    if (env.EnvironmentName == Environments.Development)
    {
        // logger.LogInformation("In Development environment");
    }
}

2

ডটনেট কোর 2.0 তে স্টার্টআপ-কনস্ট্রাক্টর কেবলমাত্র একটি আইকনফিগারেশন-প্যারামিটার আশা করে।

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

সেখানে হোস্টিংয়ের পরিবেশ কীভাবে পড়বেন? আমি এটি কনফিগার অ্যাপ্লিকেশন কনফিগারেশনের সময় প্রোগ্রাম-ক্লাসে সঞ্চয় করি (ওয়েবহোস্টের পরিবর্তে সম্পূর্ণ বিল্ডওয়েবহস্ট ব্যবহার করুন re

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }

    public static void Main(string[] args)
    {
        // Build web host
        var host = BuildWebHost(args);

        host.Run();
    }

    public static IWebHost BuildWebHost(string[] args)
    {
        return new WebHostBuilder()
            .UseConfiguration(new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("hosting.json", optional: true)
                .Build()
            )
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var env = hostingContext.HostingEnvironment;

                // Assigning the environment for use in ConfigureServices
                HostingEnvironment = env; // <---

                config
                  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

                if (env.IsDevelopment())
                {
                    var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                    if (appAssembly != null)
                    {
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }

                config.AddEnvironmentVariables();

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
            })
            .ConfigureLogging((hostingContext, builder) =>
            {
                builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                builder.AddConsole();
                builder.AddDebug();
            })
            .UseIISIntegration()
            .UseDefaultServiceProvider((context, options) =>
            {
                options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
            })
            .UseStartup<Startup>()
            .Build();
    }

পিপীলিকা এটির পরে এটি কনফিগার সার্ভিসগুলিতে পড়ে:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    var isDevelopment = Program.HostingEnvironment.IsDevelopment();
}

অবহেলিত IHostingEnਵਰচার env পরিবর্তে IWebHostEn एनভিনিউশন env ব্যবহার করুন
মার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.