অ্যাডট্রান্সিয়েন্ট, অ্যাডস্কোপড এবং অ্যাডসিংলেটন পরিষেবাগুলির পার্থক্য


933

আমি এএসপি.এনইটি কোরে নির্ভরতা ইনজেকশন (ডিআই) প্রয়োগ করতে চাই । সুতরাং এই কোডটি ConfigureServicesপদ্ধতিতে যুক্ত করার পরে , উভয় উপায়েই কাজ করে।

ASP.NET কোর services.AddTransientএবং service.AddScopedপদ্ধতিগুলির মধ্যে পার্থক্য কী ?

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

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddScoped<IEmailSender, AuthMessageSender>();
}

92
@tmg দস্তাবেজগুলি বলেছে 'প্রতিটি সময় অনুরোধ করা হলে ক্ষণস্থায়ী জীবনকালীন পরিষেবা তৈরি করা হয় are' এবং 'স্কোপড আজীবন পরিষেবাগুলি অনুরোধ অনুযায়ী একবার তৈরি করা হয়।' যা আমার ইংরেজী বোঝা যতক্ষণ না ভেবেছিল তার চেয়ে দুর্বল না হলে আসলে একই জিনিসটি বোঝায়।
নিউট্রিনো

70
@tmg আমি জানি আমি কেবল এটিই দেখিয়ে দিচ্ছি যে ডক্স এই মুহুর্তে মোটেই পরিষ্কার নয়, তাই লোককে ডক্সে দেখানো খুব সহায়ক নয়।
নিউট্রিনো

13
@ নিউট্রিনো, এজন্যই আমি এই প্রশ্নটি করেছি।
এলভিন মামাদভ

5
পার্টিতে দেরীতে, মন্তব্যগুলি পরেও পড়েছি, তবে আমি সেই নিবন্ধটি প্রিন্ট করেছি, এটি পড়েছি, এবং এখনই আমি @ নিউট্রিনোকে দেখেছি এমন মার্জিনে একই পর্যবেক্ষণটি জোট করেছিলাম। নিবন্ধটি বিশ্লেষণটি দেওয়ার ক্ষেত্রে পুরোপুরি অস্পষ্ট ছিল। উদাহরণস্বরূপ, ধন্যবাদ, কম বিভ্রান্তিকর ছিল।
ওয়েলসপ্রিং

5
আমি যতদূর বুঝতে পেরেছি: প্রতিবার অনুরোধ করা হলে ক্ষণস্থায়ী জীবনকালীন পরিষেবাগুলি তৈরি করা হয় । এখানে অনুরোধ করা শব্দটি হ'ল প্রতিদিনের ইংরেজি অর্থ কিছু চাওয়ার অর্থ, এই ক্ষেত্রে একটি পরিষেবা service শব্দ যেখানে অনুরোধ মধ্যে একবার প্রতি অনুরোধ একটি HTTP অনুরোধ বোঝায়। তবে আমি বিভ্রান্তি বুঝতে পারি।
মেমেট ওলসেন

উত্তর:


1648

টি এল; ডিআর

ক্ষণস্থায়ী বস্তু সর্বদা পৃথক; প্রতিটি নিয়ামক এবং প্রতিটি পরিষেবায় একটি নতুন উদাহরণ সরবরাহ করা হয়।

একটি অনুরোধের মধ্যে Scoped অবজেক্টগুলি একই, তবে বিভিন্ন অনুরোধের মধ্যে পৃথক।

প্রতিটি বস্তু এবং প্রতিটি অনুরোধের জন্য সিঙ্গলটন অবজেক্টগুলি সমান।

আরও স্পষ্টতার জন্য, এএসপি.এনইটি ডকুমেন্টেশনের এই উদাহরণটি পার্থক্যটি দেখায়:

এই আজীবন এবং নিবন্ধকরণ বিকল্পগুলির মধ্যে পার্থক্য প্রদর্শনের জন্য, একটি সাধারণ ইন্টারফেস বিবেচনা করুন যা এক বা একাধিক কার্যকে একটি অনন্য শনাক্তকারী, সঙ্গে অপারেশন হিসাবে উপস্থাপন করে OperationId। এই পরিষেবাটির জন্য আমরা কীভাবে আজীবন কনফিগার করব তার উপর নির্ভর করে কন্টেইনারটি অনুরোধকারী শ্রেণীর কাছে পরিষেবাটির একই বা বিভিন্ন উদাহরণ সরবরাহ করবে। কোন আজীবন অনুরোধ করা হচ্ছে তা পরিষ্কার করার জন্য, আমরা আজীবন এক প্রকারের বিকল্প তৈরি করব:

using System;

namespace DependencyInjectionSample.Interfaces
{
    public interface IOperation
    {
        Guid OperationId { get; }
    }

    public interface IOperationTransient : IOperation
    {
    }

    public interface IOperationScoped : IOperation
    {
    }

    public interface IOperationSingleton : IOperation
    {
    }

    public interface IOperationSingletonInstance : IOperation
    {
    }
}

আমরা এই ইন্টারফেসগুলি একটি একক শ্রেণীর ব্যবহার করে প্রয়োগ করি Operation, যা এর নির্মাতায় কোনও GID গ্রহণ করে, বা যদি কোনও সরবরাহ না করা হয় তবে একটি নতুন জিইউডি ব্যবহার করে:

using System;
using DependencyInjectionSample.Interfaces;
namespace DependencyInjectionSample.Classes
{
    public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
    {
        Guid _guid;
        public Operation() : this(Guid.NewGuid())
        {

        }

        public Operation(Guid guid)
        {
            _guid = guid;
        }

        public Guid OperationId => _guid;
    }
}

এরপরে, মধ্যে ConfigureServices, প্রতিটি প্রকারের নামকরণকৃত জীবনকাল অনুযায়ী ধারকটিতে যুক্ত করা হয়:

services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
services.AddTransient<OperationService, OperationService>();

নোট করুন যে IOperationSingletonInstanceপরিষেবাটি একটি নির্দিষ্ট আইডিটির একটি নির্দিষ্ট উদাহরণ ব্যবহার করছে Guid.Empty, সুতরাং এই ধরণের ব্যবহারের সময় এটি স্পষ্ট হবে। আমরা এমন একটি রেজিস্ট্রেশনও করেছি OperationServiceযা অন্যান্য Operationধরণের প্রতিটিের উপর নির্ভর করে , যাতে প্রতিটি পরিষেবা অপারেশনের জন্য এই পরিষেবাটি নিয়ামকের মতো একই উদাহরণ পাচ্ছে কিনা বা কোনও নতুন একটি অনুরোধের মধ্যে পরিষ্কার হয়ে যাবে। এই সমস্ত পরিষেবা এটির বৈশিষ্ট্য হিসাবে এর নির্ভরশীলতা প্রকাশ করে তাই সেগুলি দর্শনে প্রদর্শিত হতে পারে।

using DependencyInjectionSample.Interfaces;

namespace DependencyInjectionSample.Services
{
    public class OperationService
    {
        public IOperationTransient TransientOperation { get; }
        public IOperationScoped ScopedOperation { get; }
        public IOperationSingleton SingletonOperation { get; }
        public IOperationSingletonInstance SingletonInstanceOperation { get; }

        public OperationService(IOperationTransient transientOperation,
            IOperationScoped scopedOperation,
            IOperationSingleton singletonOperation,
            IOperationSingletonInstance instanceOperation)
        {
            TransientOperation = transientOperation;
            ScopedOperation = scopedOperation;
            SingletonOperation = singletonOperation;
            SingletonInstanceOperation = instanceOperation;
        }
    }
}

অ্যাপ্লিকেশনটিতে পৃথক পৃথক অনুরোধের মধ্যে এবং এর মধ্যে অবজেক্টের লাইফটাইমগুলি প্রদর্শনের জন্য, নমুনায় এমন একটি অন্তর্ভুক্ত রয়েছে OperationsControllerযা প্রতিটি ধরণের IOperationটাইপের অনুরোধ করে পাশাপাশি একটি OperationServiceIndexকর্ম তারপর নিয়ামক এবং সার্ভিসের সব প্রদর্শন OperationIdমান।

using DependencyInjectionSample.Interfaces;
using DependencyInjectionSample.Services;
using Microsoft.AspNetCore.Mvc;

namespace DependencyInjectionSample.Controllers
{
    public class OperationsController : Controller
    {
        private readonly OperationService _operationService;
        private readonly IOperationTransient _transientOperation;
        private readonly IOperationScoped _scopedOperation;
        private readonly IOperationSingleton _singletonOperation;
        private readonly IOperationSingletonInstance _singletonInstanceOperation;

        public OperationsController(OperationService operationService,
            IOperationTransient transientOperation,
            IOperationScoped scopedOperation,
            IOperationSingleton singletonOperation,
            IOperationSingletonInstance singletonInstanceOperation)
        {
            _operationService = operationService;
            _transientOperation = transientOperation;
            _scopedOperation = scopedOperation;
            _singletonOperation = singletonOperation;
            _singletonInstanceOperation = singletonInstanceOperation;
        }

        public IActionResult Index()
        {
            // ViewBag contains controller-requested services
            ViewBag.Transient = _transientOperation;
            ViewBag.Scoped = _scopedOperation;
            ViewBag.Singleton = _singletonOperation;
            ViewBag.SingletonInstance = _singletonInstanceOperation;

            // Operation service has its own requested services
            ViewBag.Service = _operationService;
            return View();
        }
    }
}

এখন এই নিয়ামক পদক্ষেপে দুটি পৃথক অনুরোধ করা হয়েছে:

প্রথম অনুরোধ

দ্বিতীয় অনুরোধ

OperationIdকোন অনুরোধের মধ্যে এবং অনুরোধের মধ্যে মানগুলির মধ্যে কোনটি পরিবর্তিত হয় তা লক্ষ্য করুন ।

  • ক্ষণস্থায়ী বস্তু সর্বদা পৃথক; প্রতিটি নিয়ামক এবং প্রতিটি পরিষেবায় একটি নতুন উদাহরণ সরবরাহ করা হয়।

  • একটি অনুরোধের মধ্যে Scoped অবজেক্টগুলি একই, তবে বিভিন্ন অনুরোধের মধ্যে পৃথক

  • প্রতিটি বস্তু এবং প্রতিটি অনুরোধের জন্য সিঙ্গলটন অবজেক্টগুলি সমান (কোনও উদাহরণ দেওয়া আছে কিনা তা বিবেচনা না করে ConfigureServices)


14
আমি তাদের প্রত্যেকের কার্যকারিতা বুঝতে পেরেছি, তবে কেউ অন্যের পরিবর্তে একটি ব্যবহারের প্রভাব ব্যাখ্যা করতে পারে। সঠিকভাবে ব্যবহার না করা বা অন্যটির পরিবর্তে একটি বেছে নেওয়া হলে কী সমস্যা হতে পারে।
পওয়ান নেপাল

2
বলুন আপনি সিঙ্গেলটন স্কোপ দিয়ে একটি অনুরোধ প্রসঙ্গে সম্পর্কিত অবজেক্ট (বর্তমান ব্যবহারকারীর মতো) তৈরি করছেন তবে এটি সমস্ত HTTP অনুরোধগুলিতে একই উদাহরণ হতে পারে যা পছন্দসই নয়। আইওসি হ'ল উদাহরণস্বরূপ তৈরি করার জন্য, তাই তৈরির উদাহরণটির সুযোগটি কী তা আমাদের নির্দিষ্ট করতে হবে।
একাজেমিস

1
এটি !, আমি লিখিত বিষয়টির শীর্ষে উল্লেখ করেছি! নমুনা কোডটি এমএস ডক্স থেকে অনুলিপি / আটকানো হয়েছে
akazemis

1
ধন্যবাদ। হ্যাঁ সিঙ্গেলটন সেশন / ব্যবহারকারী নির্বিশেষে অ্যাপ্লিকেশনটিতে একই হবে। স্পষ্টতই যদি আপনার অ্যাপ্লিকেশনটি মাইক্রোসার্চেস আর্কিটেকচার ব্যবহার করে এবং প্রতিটি পরিষেবা পৃথক প্রক্রিয়াতে চালিত হয় তবে প্রতিটি প্রক্রিয়াতে
সিঙ্গেলটন

1
আপনি দয়া করে অ্যাডটান্সিয়েন্ট ব্যবহারের একটি উদাহরণ দিতে পারেন? কারণ এটি প্রচুর সংস্থান ব্যবহার করার সময় আমি এটি ব্যবহার করতে কোনও উপযোগিতা পাইনি
তেরাই

318

। নেট এর নির্ভরতা ইনজেকশনটিতে তিনটি প্রধান জীবনকাল রয়েছে:

সিঙ্গেলটন যা অ্যাপ্লিকেশন জুড়ে একক উদাহরণ তৈরি করে। এটি প্রথমবারের জন্য উদাহরণটি তৈরি করে এবং সমস্ত কলগুলিতে একই বস্তুকে পুনরায় ব্যবহার করে।

স্কোপড আজীবন পরিষেবাগুলি সুযোগের মধ্যে অনুরোধ অনুসারে একবার তৈরি করা হয়। এটি বর্তমান সুযোগে একটি সিঙ্গেলনের সমতুল্য। উদাহরণস্বরূপ, এমভিসিতে এটি প্রতিটি এইচটিটিপি অনুরোধের জন্য একটি উদাহরণ তৈরি করে তবে এটি একই ওয়েব অনুরোধের মধ্যে অন্যান্য কলগুলিতে একই উদাহরণ ব্যবহার করে।

ক্ষণস্থায়ী আজীবন পরিষেবাগুলি যখনই অনুরোধ করা হয় ততক্ষণে তৈরি করা হয়। এই আজীবন হালকা ওজন, স্টেটলেস পরিষেবাগুলির জন্য সবচেয়ে ভাল কাজ করে।

পার্থক্যটি দেখতে এখানে আপনি উদাহরণ এবং সন্ধান করতে পারেন:

এএসপি.নেট 5 এমভিসি 6 নির্ভরশীল ইনজেকশন 6 ধাপে (মৃত লিঙ্কের কারণে ওয়েব সংরক্ষণাগার লিঙ্ক)

আপনার নির্ভরতা ইনজেকশন প্রস্তুত এএসপি.নেট: এএসপি.নেট 5

এবং এটি অফিসিয়াল ডকুমেন্টেশনের লিঙ্ক:

এএসপি.এনইটি কোরে নির্ভরতা ইনজেকশন


22
আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন ক্ষণস্থায়ী সবচেয়ে হালকা কেন? আমি ভেবেছিলাম ক্ষণস্থায়ীটি সবচেয়ে ভারী কাজ কারণ এটি প্রতি ইনজেকশনের জন্য প্রতিবার একটি উদাহরণ তৈরি করা দরকার।
বিশেষজ্ঞ

17
তুমি ঠিক বলছো. ক্ষণস্থায়ী সর্বাধিক লাইটওয়েট নয়, আমি কেবল বলেছি এটি হালকা ওজন বিশিষ্ট পরিষেবাগুলির জন্য উপযুক্ত :)
রেস্টস্টুল একাজেমিস

3
সুতরাং কোন দৃশ্যে আমরা স্কোপড ব্যবহার করতে পারি এবং কোন নিয়ামকের উদাহরণস্বরূপ ক্ষণস্থায়ী উদাহরণস্বরূপ যদি আমরা ডাটাবেস থেকে কয়েকটি সারি উদ্ধার করি? আমি এক্ষেত্রে স্কোপড বনাম ক্ষণস্থায়ী ব্যবহারের দৃশ্যটি বোঝার চেষ্টা করছি।
জ্ঞান

4
এটি যে প্রত্যাশা আপনি প্রত্যাশা করছেন তা সত্যই নির্ভর করে। উদাহরণস্বরূপ, যদি এটি একটি একক ডিবি কল হয় তবে এটি ব্যবহার করছেন যা আসলে কোনও তত্ক্ষণা করে না। তবে আপনি যদি একই অনুরোধে একাধিকবার ডিবিকে কল দিচ্ছেন, তবে আপনি স্কোপড আজীবন ব্যবহার করতে পারেন, কারণ এটি একই রিপোজিটরি অবজেক্টটিকে মেমরিতে রাখে এবং একই এইচটিপি অনুরোধ প্রসঙ্গে একাধিকবার পুনরায় ব্যবহার করে। যেখানে ক্ষণস্থায়ী একাধিকবার একটি নতুন সংগ্রহশালা তৈরি করে (এবং আরও স্মৃতি গ্রহণ করে)। আপনি যদি আপনার নির্দিষ্ট দৃশ্যের ব্যাখ্যা দেন তবে কোনটি আরও উপযুক্ত তা বিচার করা সহজ।
একাজেমিস

2
এখানে হাইলাইট করার জন্য একটি গুরুত্বপূর্ণ বিষয় হ'ল সিঙ্গলটন, স্কোপড এবং ট্রান্সিয়েন্ট হ'ল রাশিয়ান ডয়েলের মতো, একে অপরের মধ্যে। নেস্টিংয়ের সময় তাদের ক্রমটি বিপরীত করা সম্ভব নয়, যেমন for কোনও স্কোপড বা সিঙ্গলটন কোনও ট্রান্সিয়েন্টে থাকা যায় না, কারণ আমরা পিতামাতার জীবনকাল বাড়িয়ে দেব যা কন্টেন্টের বিপরীতে যায়!
ডি এল নরসিমহান

34

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

আপনি নীচের কন্ট্রোলার কোডটি দেখতে পারেন যেখানে আমি কনস্ট্রাক্টরে দুটি "আইডাল" এর উদাহরণ চেয়েছি। ট্রান্সিয়েন্ট, স্কোপড এবং সিঙ্গলটন সংজ্ঞায়িত করে যদি একই উদাহরণটি "_ডাল" এবং "_ডাল 1" বা অন্যটিতে ইনজেকশনের ব্যবস্থা করা হয়।

public class CustomerController : Controller
{
    IDal dal = null;

    public CustomerController(IDal _dal,
                              IDal _dal1)
    {
        dal = _dal;
        // DI of MVC core
        // inversion of control
    }
}

ক্ষণস্থায়ী: ক্ষণস্থায়ী, একক অনুরোধ এবং প্রতিক্রিয়া ইন নতুন বস্তুর দৃষ্টান্ত ইনজেকশনের করা হবে। নীচে একটি স্ন্যাপশট চিত্র রয়েছে যেখানে আমি জিইউডি মানগুলি প্রদর্শন করেছি।

এখানে চিত্র বিবরণ লিখুন

স্কোপড: স্কোপডে, একই বস্তুর উদাহরণটি একক অনুরোধ এবং প্রতিক্রিয়াতে ইনজেকশনের ব্যবস্থা করা হবে।

এখানে চিত্র বিবরণ লিখুন

সিঙ্গলটন: সিঙ্গলটনে, একই অনুরোধটি সমস্ত অনুরোধ এবং প্রতিক্রিয়া জুড়ে ইনজেকশন করা হবে। এই ক্ষেত্রে অবজেক্টের একটি বৈশ্বিক উদাহরণ তৈরি করা হবে।

নীচে একটি সাধারণ চিত্র রয়েছে যা উপরের মৌলিক চাক্ষুষভাবে ব্যাখ্যা করে।

এমভিসি ডিআই চিত্র

উপরের চিত্রটি এসবিএসএস দল আঁকা যখন আমি মুম্বাইয়ে এএসপি.এনইটি এমভিসি প্রশিক্ষণ নিচ্ছিলাম । উপরের চিত্রটি তৈরি করার জন্য একটি বড় ধন্যবাদ এসবিএসএস টিমের কাছে।


9
এটি আমি কখনও দেখা যায় এমন একটি ক্ষণস্থায়ী পরিষেবাটির একক জটিল ব্যাখ্যা। ক্ষণস্থায়ী = যেকোন সময় এই পরিষেবাটি সমাধান করা হয় তা আপনার ভেরিয়েবল নির্ধারণের সমতুল্য new TService। স্কোপড "স্কোপ" (বেশিরভাগ ক্ষেত্রে HTTP অনুরোধ) এর জন্য এটির প্রথম সূচনাটি ক্যাশে করবে। সিঙ্গেলটন অ্যাপ্লিকেশনটির আজীবন কেবলমাত্র একটি উদাহরণ ক্যাশে করবে, এটি সাধারণ। উপরের চিত্রগুলি এতটাই সংশ্লেষিত।
মার্ডক্সক্স 16

2
তাই দুঃখিত আমি ভেবেছিলাম আমি এটিকে চিত্র এবং কোড স্ন্যাপশট দিয়ে আরও সহজ করে তুলব :-) তবে আমি আপনার বক্তব্যটি পাই না।
শিবপ্রসাদ কৈরালা

30
  • সিঙ্গলটন অ্যাপ্লিকেশন ডোমেনটির আজীবন একক উদাহরণ।
  • স্কোপড স্কোপযুক্ত অনুরোধের সময়কালের জন্য একক উদাহরণ, যার অর্থ প্রতি HTTP HT এএসপি.এনইটি-তে অনুরোধ।
  • ক্ষণস্থায়ী কোড অনুরোধ অনুযায়ী একক উদাহরণ ।

সাধারণত কোড অনুরোধটি যেমন কনস্ট্রাক্টর প্যারামিটারের মাধ্যমে করা উচিত

public MyConsumingClass(IDependency dependency)

আমি @ একাজেমিসের উত্তরে উল্লেখ করতে চেয়েছিলাম যে ডিআই এর পরিপ্রেক্ষিতে "পরিষেবাগুলি" আরএসএফুল সার্ভিস বোঝায় না; পরিষেবাগুলি নির্ভরতাগুলির কার্যকারিতা সরবরাহ করে implement


16

AddSingleton ()

অ্যাডসিংলেটন () পরিষেবাটি যখন প্রথম অনুরোধ করা হয় তখন সেটির একক দৃষ্টান্ত তৈরি করে এবং সেই পরিষেবাটি যেখানে প্রয়োজন সেখানে সমস্ত জায়গায় একই উদাহরণটি পুনরায় ব্যবহার করে।

AddScoped ()

প্রতিটি স্ক্রিপ্ট অনুরোধ সহ একটি স্কোপড পরিষেবাতে আমরা একটি নতুন উদাহরণ পাই। যাইহোক, একই HTTP অনুরোধের মধ্যে, যদি ভিউ এবং নিয়ন্ত্রকের মতো একাধিক জায়গায় পরিষেবাটি প্রয়োজন হয়, তবে সেই উদাহরণটি এইচটিটিপি অনুরোধের পুরো ক্ষেত্রের জন্য সরবরাহ করা হবে। তবে প্রতিটি নতুন এইচটিটিপি অনুরোধ সেবার একটি নতুন উদাহরণ পাবে।

AddTransient ()

ক্ষণস্থায়ী পরিষেবা সহ, যখনই কোনও সার্ভিস উদাহরণ অনুরোধ করা হয় তখনই এটি একটি এইচটিটিপি অনুরোধের ক্ষেত্রের মধ্যে বা বিভিন্ন এইচটিটিপি অনুরোধ জুড়ে একটি নতুন উদাহরণ সরবরাহ করা হয়।


5

এই প্রশ্নের উত্তর খোঁজার পরে আমি একটি উজ্জ্বল ব্যাখ্যা পেয়েছি যা একটি উদাহরণ দিয়ে আমি আপনার সাথে ভাগ করতে চাই।

আপনি একটি ভিডিও যে পার্থক্য প্রকট দেখতে পারেন এখানে

এই উদাহরণে আমাদের দেওয়া কোডটি রয়েছে:

public interface IEmployeeRepository
{
    IEnumerable<Employee> GetAllEmployees();
    Employee Add(Employee employee);
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MockEmployeeRepository : IEmployeeRepository
{
    private List<Employee> _employeeList;

    public MockEmployeeRepository()
    {
        _employeeList = new List<Employee>()
    {
        new Employee() { Id = 1, Name = "Mary" },
        new Employee() { Id = 2, Name = "John" },
        new Employee() { Id = 3, Name = "Sam" },
    };
    }

    public Employee Add(Employee employee)
    {
        employee.Id = _employeeList.Max(e => e.Id) + 1;
        _employeeList.Add(employee);
        return employee;
    }

    public IEnumerable<Employee> GetAllEmployees()
    {
        return _employeeList;
    }
}

HomeController

public class HomeController : Controller
{
    private IEmployeeRepository _employeeRepository;

    public HomeController(IEmployeeRepository employeeRepository)
    {
        _employeeRepository = employeeRepository;
    }

    [HttpGet]
    public ViewResult Create()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Create(Employee employee)
    {
        if (ModelState.IsValid)
        {
            Employee newEmployee = _employeeRepository.Add(employee);
        }

        return View();
    }
}

ভিউ তৈরি করুন

@model Employee
@inject IEmployeeRepository empRepository

<form asp-controller="home" asp-action="create" method="post">
    <div>
        <label asp-for="Name"></label>
        <div>
            <input asp-for="Name">
        </div>
    </div>

    <div>
        <button type="submit">Create</button>
    </div>

    <div>
        Total Employees Count = @empRepository.GetAllEmployees().Count().ToString()
    </div>
</form>

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IEmployeeRepository, MockEmployeeRepository>();
}

এই কোড মধ্যে দেখতে ও সুইচ সৃষ্টি বাটনে প্রেস কপি-পেস্ট করুন AddSingleton, AddScopedএবং AddTransientআপনি সাথে সাথে প্রতিটি সাহায্য করতে পারে যে আপনি এই ব্যাখ্যা বুঝতে একটি ভিন্ন ফলাফল পেতে হবে:

AddSingleton () - নামটি থেকে বোঝা যায়, অ্যাডসিংলেটন () পদ্ধতিটি একটি সিঙ্গলটন পরিষেবা তৈরি করে। যখন প্রথম অনুরোধ করা হয় তখন একটি সিঙ্গলটন পরিষেবা তৈরি করা হয়। এই একই উদাহরণটি পরবর্তী সমস্ত অনুরোধগুলির দ্বারা ব্যবহৃত হয়। সুতরাং সাধারণভাবে, একটি সিঙ্গলটন পরিষেবা অ্যাপ্লিকেশন অনুসারে কেবল একবার সময় তৈরি করা হয় এবং সেই একক দৃষ্টিকোণ অ্যাপ্লিকেশন লাইফ সময় জুড়ে ব্যবহৃত হয়।

অ্যাড ট্রান্সিয়েন্ট () - এই পদ্ধতিটি একটি ক্ষণস্থায়ী পরিষেবা তৈরি করে। প্রতিটি বার যখন এটির অনুরোধ করা হয় তখন একটি ট্রান্সিয়েন্ট পরিষেবার একটি নতুন উদাহরণ তৈরি করা হয়।

অ্যাডস্কোপড () - এই পদ্ধতিটি একটি স্কোপড পরিষেবা তৈরি করে। সুযোগের মধ্যে অনুরোধ অনুযায়ী একবার স্কোপড পরিষেবার একটি নতুন উদাহরণ তৈরি করা হয়। উদাহরণস্বরূপ, একটি ওয়েব অ্যাপ্লিকেশনটিতে এটি প্রতিটি http অনুরোধের জন্য 1 টি ইভেন্ট তৈরি করে তবে একই ওয়েব অনুরোধের মধ্যে অন্যান্য কলগুলিতে একই উদাহরণ ব্যবহার করে।


2

কোনটি ব্যবহার করতে হবে

অস্থায়ী

  • যেহেতু এগুলি প্রতিবার তৈরি করা হয়েছে তারা আরও বেশি স্মৃতি ও সংস্থান ব্যবহার করবে এবং কার্য সম্পাদনে নেতিবাচক প্রভাব ফেলতে পারে
  • অল্প বা কোনও রাজ্যের সাথে লাইটওয়েট পরিষেবার জন্য এটি ব্যবহার করুন ।

scoped

  • আপনি যখন কোনও অনুরোধের মধ্যে রাষ্ট্র বজায় রাখতে চান তখন আরও ভাল বিকল্প।

একক বস্তু

  • এই পরিষেবাগুলিতে মেমরি ফাঁস সময়ের সাথে সাথে তৈরি হবে।
  • এগুলি তৈরি করার সাথে সাথে স্মৃতিশক্তির দক্ষতা একবারে আবার সর্বত্র ব্যবহার করা হয়েছে।

সিলেটলেটগুলি ব্যবহার করুন যেখানে আপনার অ্যাপ্লিকেশন প্রশস্ত স্থিতি বজায় রাখতে হবে। অ্যাপ্লিকেশন কনফিগারেশন বা প্যারামিটার, লগিং পরিষেবা, ডেটা ক্যাশে করা এমন কয়েকটি উদাহরণ যেখানে আপনি সিলেটলেট ব্যবহার করতে পারেন।

অন্য লাইফটাইমগুলির সাথে অন্যের সাথে ইনজেকশন সেবা

  1. স্কেলড এবং অস্থায়ী পরিষেবাগুলিকে একক সার্ভিসে কখনই ইনজেক্ট করবেন না। (এটি কার্যকরভাবে ক্ষণস্থায়ী বা স্কোপড পরিষেবাটিকে সিঙ্গলটনে রূপান্তর করে))
  2. ক্ষণস্থায়ী পরিষেবাগুলিতে ক্ষণস্থায়ী পরিষেবাগুলি কখনই ইনজেক্ট করবেন না (এটি ক্ষণস্থায়ী পরিষেবাটিকে স্কোপে রূপান্তর করে))

এটি সেরা উত্তর। আপনি উদাহরণ দিন যেখানে আমি অংশ চান। তারা কীভাবে কাজ করে তা বোঝা এত কঠিন নয়। কোন পরিষেবাটি কোথায় রাখা উচিত এবং কখন এবং কখন সেগুলি থেকে স্মৃতি পরিষ্কার করা হয়েছে তা চিন্তা করা শক্ত। আপনি যদি সে সম্পর্কে আরও ব্যাখ্যা করেন তবে দুর্দান্ত হবে।
ভ্যালেন্টাসম

1

উদাহরণ হিসাবে এখানে বর্ণিত (এই লিঙ্কটি খুব কার্যকর)

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


0

অ্যাডসিংলেটন বনাম অ্যাডস্কোপড বনাম অ্যাড ট্রান্সিয়েন্টের মধ্যে পার্থক্য

সেবা নিবন্ধকরণ

নির্ভরতা ইনজেকশন ধারক দিয়ে পরিষেবাগুলি নিবন্ধ করার জন্য এএসপি.এনইটি কোরটি নিম্নলিখিত 3 টি পদ্ধতি সরবরাহ করে। আমরা যে পদ্ধতিটি ব্যবহার করি তা নিবন্ধিত পরিষেবার জীবনকাল নির্ধারণ করে।

অ্যাডসিংলেটন () - নামটি থেকে বোঝা যায়, অ্যাডসিংলেটন () পদ্ধতিটি একটি সিঙ্গলটন পরিষেবা তৈরি করে। যখন প্রথম অনুরোধ করা হয় তখন একটি সিঙ্গলটন পরিষেবা তৈরি করা হয়। এই একই উদাহরণটি পরবর্তী সমস্ত অনুরোধগুলির দ্বারা ব্যবহৃত হয়। সুতরাং সাধারণভাবে, একটি সিঙ্গলটন পরিষেবা অ্যাপ্লিকেশন অনুসারে কেবল একবার সময় তৈরি করা হয় এবং সেই একক দৃষ্টিকোণ অ্যাপ্লিকেশন লাইফ সময় জুড়ে ব্যবহৃত হয়।

অ্যাড ট্রান্সিয়েন্ট () - এই পদ্ধতিটি একটি ক্ষণস্থায়ী পরিষেবা তৈরি করে। প্রতিটি বার যখন এটির অনুরোধ করা হয় তখন একটি ট্রান্সিয়েন্ট পরিষেবার একটি নতুন উদাহরণ তৈরি করা হয়।

অ্যাডস্কোপড () - এই পদ্ধতিটি একটি স্কোপড পরিষেবা তৈরি করে। সুযোগের মধ্যে অনুরোধ অনুযায়ী একবার স্কোপড পরিষেবার একটি নতুন উদাহরণ তৈরি করা হয়। উদাহরণস্বরূপ, একটি ওয়েব অ্যাপ্লিকেশনটিতে এটি প্রতিটি http অনুরোধের জন্য 1 টি ইভেন্ট তৈরি করে তবে একই ওয়েব অনুরোধের মধ্যে অন্যান্য কলগুলিতে একই উদাহরণ ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.