AddTransient, AddScoped සහ AddSingleton සේවා වෙනස්කම්


1018

ASP.NET Core හි පරායත්ත එන්නත් කිරීම (DI) ක්‍රියාත්මක කිරීමට මට අවශ්‍යය . එබැවින් මෙම කේතය ConfigureServicesක්‍රමයට එකතු කිරීමෙන් පසුව ක්‍රම දෙකම ක්‍රියාත්මක වේ.

ASP.NET Core හි ඇති ක්‍රම services.AddTransientසහ service.AddScopedක්‍රම අතර වෙනස කුමක්ද?

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

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

100
mstmg ලියකියවිලි පවසන්නේ 'ඉල්ලන සෑම අවස්ථාවකම අස්ථිර ජීවිත සේවා නිර්මාණය කරනු ලැබේ.' සහ 'ඉල්ලීමකට වරක් විෂය පථ ජීවිත සේවා නිර්මාණය කරනු ලැබේ.' මගේ ඉංග්‍රීසි ග්‍රහණය මා සිතුවාට වඩා දුර්වල නම් මිස ඇත්ත වශයෙන්ම එකම දෙය අදහස් වේ.
නියුට්‍රිනෝ

71
මම දන්නවා. මම පෙන්වා දෙන්නේ මේ අවස්ථාවේ දී ලියකියවිලි කිසිසේත් පැහැදිලි නැති නිසා මිනිසුන් ලියකියවිලි වෙත යොමු කිරීම එතරම් ප්‍රයෝජනවත් නොවේ.
නියුට්‍රිනෝ

15
E නියුට්‍රිනෝ, ඒ නිසයි මම මේ ප්‍රශ්නය ඇසුවේ.
එල්වින් මාමඩොව්

5
සාදයට ප්‍රමාද වී, පසුව පවා අදහස් කියවා බැලුවද, මම එම ලිපිය මුද්‍රණය කර, කියවා, එම නිරීක්‍ෂණයම ආන්තිකයේ සටහන් කර ඇත්තෙමි. එම විශ්ලේෂණය ඉදිරිපත් කිරීමේදී ලිපිය සම්පූර්ණයෙන්ම අපැහැදිලි විය. උදාහරණය, ​​ස්තූතිවන්ත වන පරිදි, අවුල් සහගත විය.
වෙල්ස්ප්‍රිං

8
මා තේරුම් ගත් පරිදි: ඔවුන් ඉල්ලා සිටින සෑම අවස්ථාවකම අස්ථිර ජීවිත කාලය තුළ සේවාවන් නිර්මාණය වේ . මෙහි ඉල්ලූ වචනය එදිනෙදා ඉංග්‍රීසි අර්ථය වන්නේ යමක් ඉල්ලීමයි, මේ අවස්ථාවේ දී සේවාවක්. යන වචනය ඇති ෙහයින් ඉල්ලීම දී ඉල්ලීම අනුව වරක් විසින් HTTP ඉල්ලීමක් කරයි. නමුත් මට තේරෙනවා ව්‍යාකූලත්වය.
මෙමෙට් ඔල්සන්

Answers:


1781

ටීඑල්; ඩී.ආර්

අස්ථිර වස්තූන් සැමවිටම වෙනස් ය; සෑම පාලකයකුටම සහ සෑම සේවාවක් සඳහාම නව අවස්ථාවක් සපයනු ලැබේ.

විෂය පථය වස්තු ඉල්ලීමක් තුළ සමාන වේ, නමුත් විවිධ ඉල්ලීම් අතර වෙනස් වේ.

සෑම වස්තුවකටම සහ සෑම ඉල්ලීමකටම සිංගල්ටන් වස්තු සමාන වේ.

වැඩි පැහැදිලි කිරීමක් සඳහා, ASP.NET ප්‍රලේඛනයේ මෙම උදාහරණයේ වෙනස පෙන්වයි:

මෙම ජීවිත කාලය සහ ලියාපදිංචි කිරීමේ විකල්ප අතර වෙනස නිරූපණය කිරීම සඳහා, අද්විතීය හඳුනාගැනීමක් සහිත මෙහෙයුමක් ලෙස කාර්යයන් එකක් හෝ කිහිපයක් නියෝජනය කරන සරල අතුරු මුහුණතක් සලකා බලන්න , 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එය එහි ඉදිකිරීම්කරු තුළ GUID එකක් පිළිගනී, නැතහොත් කිසිවක් ලබා නොදුනහොත් නව GUID භාවිතා කරයි:

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මෙන්ම a OperationService. මෙම Indexපියවර පසුව පාලකය ගේ හා සේවා ගේ දර්ශනය 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ඉල්ලීමක් තුළ සහ ඉල්ලීම් අතර වෙනස් වන අගයන් මොනවාදැයි නිරීක්ෂණය කරන්න .

  • අස්ථිර වස්තූන් සැමවිටම වෙනස් ය; සෑම පාලකයකුටම සහ සෑම සේවාවක් සඳහාම නව අවස්ථාවක් සපයනු ලැබේ.

  • විෂය පථය වස්තු ඉල්ලීමක් තුළ සමාන වේ, නමුත් විවිධ ඉල්ලීම් අතර වෙනස් වේ

  • සිංගල්ටන් වස්තූන් සෑම වස්තුවකටම සහ සෑම ඉල්ලීමකටම සමාන වේ (නිදසුනක් සපයා තිබේද යන්න නොසලකා ConfigureServices)


16
මම ඒ එක් එක් කාර්යයන් තේරුම් ගත්තා, නමුත් යමෙකුට අනෙක් ඒවා වෙනුවට එකක් භාවිතා කිරීමේ බලපෑම පැහැදිලි කළ හැකිය. නිවැරදිව භාවිතා නොකළහොත් ඇතිවිය හැකි ගැටළු හෝ වෙනත් එකක් වෙනුවට එකක් තෝරා ගන්න.
පවන් නෙපාල්

4
ඔබ සිංගල්ටන් විෂය පථය සමඟ ඉල්ලීම් සන්දර්භය ආශ්‍රිත වස්තුවක් (වත්මන් පරිශීලකයා වැනි) නිර්මාණය කරන බව පවසන්න, එවිට එය අපේක්ෂා නොකරන සියලුම http ඉල්ලීම් අතර එකම අවස්ථාවකි. අයිඕසී යනු සිදුවීම් නිර්මාණය කිරීම ය, එබැවින් අප විසින් නිර්මාණය කරන ලද සිද්ධියේ විෂය පථය කුමක්ද යන්න සඳහන් කළ යුතුය.
akazemis

1
එය!, මම මාතෘකාවේ ඉහළින් ඇති සබැඳිය සඳහන් කර ඇත්තෙමි! නියැදි කේතය MS docs වෙතින් පිටපත් කර අලවා ඇත
akazemis

1
ස්තූතියි. සැසිය / පරිශීලකයා නොසලකා යෙදුම පුරාම සිංගල්ටන් එක සමාන වේ. පැහැදිලිවම ඔබගේ යෙදුම මයික්‍රෝ සර්විසස් ගෘහ නිර්මාණ ශිල්පය භාවිතා කරන්නේ නම් සහ එක් එක් සේවාව වෙනම ක්‍රියාවලියක ක්‍රියාත්මක වන්නේ නම්, එක් එක් ක්‍රියාවලිය තුළ
සිංගල්ටන්

1
කරුණාකර addTransient භාවිතය පිළිබඳ උදාහරණයක් අපට ලබා දිය හැකිද? එය ඕනෑවට වඩා සම්පත් භාවිතා කරන අතරේ එය භාවිතා කිරීමට කිසිදු උපයෝගීතාවයක් මට හමු නොවූ බැවිනි
ටෙරායි

333

.NET හි පරායත්ත එන්නතෙහි ප්‍රධාන ජීවිත කාලය තුනක් ඇත:

යෙදුම පුරාම තනි අවස්ථාවක් නිර්මාණය කරන සිංගල්ටන් . එය පළමු වරට නිදසුන නිර්මාණය කරන අතර සියලු ඇමතුම් වලදී එකම වස්තුව නැවත භාවිතා කරයි.

විෂය පථය තුළ එක් ඉල්ලීමකට වරක් විෂය පථයේ ජීවිත සේවා නිර්මාණය කෙරේ. එය වර්තමාන විෂය පථයේ සිංගල්ටන් එකකට සමාන වේ. උදාහරණයක් ලෙස, MVC හි එය එක් එක් HTTP ඉල්ලීම සඳහා එක් අවස්ථාවක් නිර්මාණය කරයි, නමුත් එය එකම වෙබ් ඉල්ලීම තුළ අනෙක් ඇමතුම් වලදී එකම අවස්ථාව භාවිතා කරයි.

ඔවුන් ඉල්ලා සිටින සෑම අවස්ථාවකම අස්ථිර ජීවිත සේවා නිර්මාණය වේ. මෙම ජීවිත කාලය සැහැල්ලු, අස්ථායි සේවාවන් සඳහා වඩාත් සුදුසු වේ.

මෙහි ඔබට වෙනස දැක ගත හැකි අතර උදාහරණ:

පියවර 6 කින් ASP.NET 5 MVC6 යැපුම් එන්නත් කිරීම (මියගිය සබැඳිය හේතුවෙන් වෙබ් සංරක්ෂිත සබැඳිය)

ඔබේ යැපුම් එන්නත් සූදානම් ASP.NET: ASP.NET 5

නිල ලියකියවිලි සඳහා සබැඳිය මෙයයි:

ASP.NET Core හි පරායත්ත එන්නත් කිරීම


26
අස්ථිර වඩාත් සැහැල්ලු වන්නේ මන්දැයි ඔබට පැහැදිලි කළ හැකිද? සෑම එන්නතකටම සෑම අවස්ථාවකම නිදසුනක් නිර්මාණය කළ යුතු නිසා අස්ථිරය වඩාත්ම බර වැඩක් යැයි මම සිතුවෙමි.
අවශ්‍යයි

19
ඔයා හරි. අස්ථිර යනු වඩාත්ම සැහැල්ලු බර නොවේ, මම කීවේ එය සැහැල්ලු RESTful සේවාවන් සඳහා සුදුසු බවයි :)
akazemis

3
දත්ත සමුදායෙන් පේළි කිහිපයක් ලබා ගන්නේ නම්, අපට විෂය පථය භාවිතා කළ හැකි සහ පාලක උදාහරණයේ කුමන අස්ථිරද? මම මේ අවස්ථාවේ දී විෂය පථයට එදිරිව අස්ථිර භාවිත අවස්ථා තේරුම් ගැනීමට උත්සාහ කරමි.
sensei

5
එය සැබවින්ම රඳා පවතින්නේ ඔබ අපේක්ෂා කරන තර්කනය මත ය. උදාහරණයක් ලෙස, එය තනි ඩීබී ඇමතුමක් නම් එය ඇත්ත වශයෙන්ම ඔබ භාවිතා කරන කුමන වෙනසක් නොකරයි. නමුත් ඔබ එකම ඉල්ලීමකට කිහිප වතාවක් db අමතන්නේ නම්, ඔබට එකම නිධිය වස්තුව මතකයේ තබාගෙන එකම Http ඉල්ලීම් සන්දර්භය තුළ කිහිප වතාවක් නැවත භාවිතා කරන බැවින් ඔබට විෂය පථය භාවිතා කළ හැකිය. අස්ථිර තැනැත්තා නව නිධිය වස්තුවක් කිහිප වතාවක් නිර්මාණය කරන අතර (වැඩි මතකයක් පරිභෝජනය කරයි). ඔබේ විශේෂිත තත්වය ඔබ පැහැදිලි කරන්නේ නම් වඩාත් සුදුසු වන්නේ කුමක්දැයි විනිශ්චය කිරීම පහසුය.
akazemis

4
මෙහිදී ඉස්මතු කළ යුතු එක් වැදගත් කරුණක් වන්නේ සිංගල්ටන්, විෂය පථය සහ අස්ථිරය රුසියානු ඩොයිල්ස් වැනි ය. කැදැල්ල කිරීමේදී ඔවුන්ගේ අනුපිළිවෙල ආපසු හැරවිය නොහැක, උදා. ස්කෝප් හෝ සිංගල්ටන් එකක් අස්ථිරව අඩංගු විය නොහැක, මන්ද අපි දෙමව්පියන්ගේ ජීවිත කාලය දීර් ing කරනුයේ එය පාලනය කිරීමට එරෙහිව ය!
ඩී.එල්. නරසිංහන්

39

ASP.NET MVC core DI හි එකම වර්ගයේ බහුවිධ වස්තු එන්නත් කළ යුතු විට අස්ථිර, විෂය පථය සහ සිංගල්ටන් වස්තු නිර්මාණය කිරීමේ ක්‍රියාවලිය අර්ථ දක්වයි. ඔබ පරායත්ත එන්නත් කිරීමට අළුත් නම් ඔබට මෙම DI IoC වීඩියෝව දැක ගත හැකිය .

ඉදිකිරීම්කරු තුළ "අයිඩල්" අවස්ථා දෙකක් ඉල්ලා ඇති පහත පාලක කේතය ඔබට දැක ගත හැකිය. එකම අවස්ථාව "_dal" සහ "_dal1" හෝ වෙනත් ආකාරයකින් එන්නත් කරන්නේද යන්න අස්ථිර, විෂය පථය සහ සිංගල්ටන් අර්ථ දක්වයි.

public class CustomerController : Controller
{
    IDal dal = null;

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

අස්ථිර: අස්ථිර, නව වස්තු අවස්ථා තනි ඉල්ලීමකින් සහ ප්‍රතිචාරයකින් එන්නත් කරනු ලැබේ. පහත දැක්වෙන්නේ මම GUID අගයන් පෙන්වන ස්නැප්ෂොට් රූපයකි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

විෂය පථය: විෂය පථය තුළ, එකම වස්තුවක් එකම ඉල්ලීමකින් සහ ප්‍රතිචාරයකින් එන්නත් කරනු ලැබේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

සිංගල්ටන්: සිංගල්ටන් වලදී, එකම ඉල්ලීම සියලු ප්‍රතිචාර සහ ප්‍රතිචාර හරහා එන්නත් කරනු ලැබේ. මෙම අවස්ථාවේ දී වස්තුවෙහි එක් ගෝලීය අවස්ථාවක් නිර්මාණය වේ.

පහත දැක්වෙන්නේ ඉහත මූලික කරුණු දෘශ්‍යමය වශයෙන් පැහැදිලි කරන සරල රූප සටහනකි.

MVC DI රූපය

මම මුම්බායි හි ASP.NET MVC පුහුණුව ලබන විට ඉහත රූපය SBSS කණ්ඩායම විසින් ඇද ගන්නා ලදී . ඉහත රූපය නිර්මාණය කිරීම සඳහා විශාල ස්තූතියක් SBSS කණ්ඩායමට ලැබේ.


11
මෙය මා මෙතෙක් දැක ඇති අස්ථිර සේවාවක් පිළිබඳ වඩාත් සංකීර්ණ පැහැදිලි කිරීමකි. අස්ථිර = මෙම සේවාව නිරාකරණය කරන ඕනෑම වේලාවක ඔබේ විචල්‍යය පැවරීමට සමාන වේ new TService. විෂය පථය එම “විෂය පථය” සඳහා එහි පළමු ආරම්භය හැඹිලිගත කරයි (බොහෝ අවස්ථාවන්හි http ඉල්ලීම). යෙදුමේ ජීවිත කාලය පුරාවටම සිංගල්ටන් හැඹිලිගත කරන්නේ එක් අවස්ථාවක් පමණි. ඉහත රූප සටහන් එතරම් තදින් බැඳී ඇත.
මාර්ඩොක්ස්

2
කණගාටුයි මම සිතුවේ රූප සටහන් සහ කේත ස්නැප්ෂොට් සමඟ එය වඩාත් සරල කරාවි :-) නමුත් මම ඔබේ අදහස තේරුම් ගනිමි.
ශිව්ප්‍රසාද් කොයිරාලා

32
  • සිංගල්ටන් යනු යෙදුම් වසමේ ජීවිත කාලය සඳහා තනි අවස්ථාවකි.
  • විෂය පථය යනු විෂය පථයේ ඉල්ලීමෙහි කාලසීමාව සඳහා තනි අවස්ථාවකි, එයින් අදහස් වන්නේ ASP.NET හි HTTP ඉල්ලීමකට අනුව ය.
  • අස්ථිර යනු කේත ඉල්ලීමකට එක් අවස්ථාවකි .

සාමාන්‍යයෙන් කේත ඉල්ලීම කළ යුත්තේ ඉදිකිරීම්කරු පරාමිතියක් හරහා ය

public MyConsumingClass(IDependency dependency)

DI හි සන්දර්භය තුළ “සේවාවන්” යනු RESTful සේවාවන් අදහස් නොකරන බවට @ akazemis ගේ පිළිතුරෙන් මට පෙන්වා දීමට අවශ්‍ය විය; සේවා යනු ක්‍රියාකාරීත්වය සපයන පරායත්තතාවයන් ක්‍රියාත්මක කිරීමයි.


24

භාවිතා කළ යුතු එක

අස්ථිර

  • ඒවා නිර්මාණය කරන සෑම අවස්ථාවකම ඔවුන් වැඩි මතකයක් සහ සම්පත් භාවිතා කරන අතර කාර්ය සාධනය කෙරෙහි negative ණාත්මක බලපෑමක් ඇති කළ හැකිය
  • සුළු හෝ තත්වයක් නොමැති සැහැල්ලු සේවාවක් සඳහා මෙය භාවිතා කරන්න .

විෂය පථය

  • ඉල්ලීමක් තුළ තත්වය පවත්වා ගැනීමට ඔබට අවශ්‍ය විට වඩා හොඳ විකල්පය.

සිංගල්ටන්

  • මෙම සේවාවන්හි මතක කාන්දු වීම කාලයත් සමඟ වර්ධනය වේ.
  • සෑම තැනකම නැවත භාවිතා කළ පසු ඒවා නිර්මාණය කළ බැවින් මතකය කාර්යක්ෂම වේ.

යෙදුම පුළුල් ලෙස පවත්වා ගැනීමට ඔබට අවශ්‍ය තැන සිංගල්ටන් භාවිතා කරන්න. යෙදුම් වින්‍යාසය හෝ පරාමිතීන්, ලොග් කිරීමේ සේවාව, දත්ත හැඹිලි කිරීම ඔබට තනි බොත්තම් භාවිතා කළ හැකි උදාහරණ කිහිපයකි.

විවිධ ජීවිත කාලය සමඟ තවත් සේවාවක් එන්නත් කිරීම

  1. කිසි විටෙකත් විෂය පථ සහ අස්ථිර සේවාවන් සිංගල්ටන් සේවාවට ඇතුල් නොකරන්න. (මෙය අස්ථිර හෝ විෂය පථය සහිත සේවාව සිංගල්ටන් බවට effectively ලදායී ලෙස පරිවර්තනය කරයි.)
  2. කිසි විටෙකත් අස්ථිර සේවාවන් විෂය පථයට ඇතුළත් නොකරන්න (මෙය අස්ථිර සේවාව විෂය පථයට පරිවර්තනය කරයි.)

3
මෙය හොඳම පිළිතුරයි. ඔබ උදාහරණ දෙන කොටසකට මම කැමතියි. ඔවුන් ක්‍රියා කරන ආකාරය තේරුම් ගැනීම එතරම් අපහසු නොවේ. කුමන සේවාවක් දැමිය යුතුද සහ ඒවා මතකය පිරිසිදු කරන්නේ කෙසේද සහ කෙසේද යන්න සිතීම දුෂ්කර ය. ඔබ ඒ ගැන වැඩි විස්තර කළහොත් එය ඉතා හොඳ වේ.
valentasm

Transient"සුළු හෝ රාජ්‍යයක් නොමැති සැහැල්ලු සේවාවක්" සඳහා නිර්දේශ කරන්නේ මන්දැයි මට තේරෙන්නේ නැත . එවැනි අවස්ථාවක සිංගල්ටන් නොවිය යුත්තේ ඇයි? එම කුඩා සේවාව එක් වරක් පමණක් ස්ථාපනය කර එය අස්ථායි බැවින් කිහිප වතාවක් භාවිතා කිරීම වඩා හොඳ නොවේද? සේවා ක්ෂණික මිල අඩු වුවද, ඔබ එය බොහෝ වාරයක් කළහොත්, පොදු කාර්යය වර්ධනය වේ.
සිංගල්ටන්

19

AddSingleton ()

AddSingleton () විසින් සේවාව පළමු වරට ඉල්ලූ විට එය තනි අවස්ථාවක් නිර්මාණය කරන අතර එම සේවාව අවශ්‍ය සියලුම ස්ථානවල එම අවස්ථාවම නැවත භාවිතා කරයි.

AddScoped ()

විෂය පථය සහිත සේවාවක, සෑම HTTP ඉල්ලීමක් සමඟම, අපට නව අවස්ථාවක් ලැබේ. කෙසේ වෙතත්, එකම HTTP ඉල්ලීම තුළ, දර්ශනය සහ පාලකය වැනි ස්ථාන කිහිපයකම සේවාව අවශ්‍ය නම්, එම HTTP ඉල්ලීමේ සම්පූර්ණ විෂය පථය සඳහා එකම අවස්ථාව ලබා දේ. නමුත් සෑම නව HTTP ඉල්ලීමකටම සේවාවේ නව අවස්ථාවක් ලැබෙනු ඇත.

AddTransient ()

අස්ථිර සේවාවක් සමඟ, සේවා අවස්ථාවක් ඉල්ලා සිටින සෑම අවස්ථාවකම එය එකම HTTP ඉල්ලීමක විෂය පථය තුළ හෝ විවිධ HTTP ඉල්ලීම් හරහා වේවා නව අවස්ථාවක් ලබා දේ.


9

AddSingleton vs AddScoped vs AddTransient අතර වෙනස

සේවා ලියාපදිංචි කිරීම

ASP.NET හරය පරායත්ත එන්නත් කන්ටේනරය සමඟ සේවාවන් ලියාපදිංචි කිරීම සඳහා පහත සඳහන් ක්‍රම 3 සපයයි. අප භාවිතා කරන ක්‍රමය ලියාපදිංචි සේවාවේ ආයු කාලය තීරණය කරයි.

AddSingleton () - නමට අනුව, AddSingleton () ක්‍රමය මඟින් තනි සේවාවක් නිර්මාණය කරයි. පළමු වරට ඉල්ලූ විට සිංගල්ටන් සේවාවක් නිර්මාණය වේ. මෙම අවස්ථාවම පසුව ඇති සියලුම ඉල්ලීම් මගින් භාවිතා කරයි. එබැවින් පොදුවේ ගත් කල, සිංගල්ටන් සේවාවක් නිර්මාණය වන්නේ එක් යෙදුමකට එක් වරක් පමණක් වන අතර එම තනි අවස්ථාව යෙදුමේ ජීවිත කාලය පුරාම භාවිතා වේ.

AddTransient () - මෙම ක්‍රමය මඟින් අස්ථිර සේවාවක් නිර්මාණය කරයි. අස්ථිර සේවාවක් ඉල්ලා සිටින සෑම අවස්ථාවකම නව අවස්ථාවක් නිර්මාණය වේ.

AddScoped () - මෙම ක්‍රමය මඟින් විෂය පථයක් නිර්මාණය කරයි. විෂය පථය තුළ ඉල්ලීමකට වරක් විෂය පථ සේවාවක නව අවස්ථාවක් නිර්මාණය වේ. උදාහරණයක් ලෙස, වෙබ් යෙදුමක දී එය එක් එක් http ඉල්ලීමකට එක් අවස්ථාවක් නිර්මාණය කරන නමුත් එම වෙබ් ඉල්ලීම තුළම අනෙක් ඇමතුම් වලදී එකම අවස්ථාව භාවිතා කරයි.


පින්තූරයක් තිබීම තරම්ම හොඳයි, ඇණවුම Transient-> Scoped-> Singletonහෝ වෙනත් ආකාරයකින් නොවිය යුතුය යන්නට වඩා එය මට කරදර කරයි. ඇති Transientමට අමුතු ඇඟ ගැහෙන ලබා මැද වර්ගයන් ය.
Askolein

6

මෙම ප්‍රශ්නයට පිළිතුරක් සෙවීමෙන් පසු මම ඔබ සමඟ බෙදා ගැනීමට කැමති උදාහරණයක් සමඟ දීප්තිමත් පැහැදිලි කිරීමක් සොයා ගතිමි.

ඔබ අතර ඇති වෙනස්කම් පෙන්නුම් කරන වීඩියෝ නැරඹීමට හැකිය මුල්

මෙම උදාහරණයේ දී අපට මෙම කේතය ඇත:

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ඔබට සෑම විටම වෙනස් ප්‍රති result ලයක් ලැබෙනු ඇත, එය ඔබට මෙම පැහැදිලි කිරීම තේරුම් ගැනීමට උපකාරී වනු ඇත:

AddSingleton () - නමට අනුව, AddSingleton () ක්‍රමය මඟින් තනි සේවාවක් නිර්මාණය කරයි. පළමු වරට ඉල්ලූ විට සිංගල්ටන් සේවාවක් නිර්මාණය වේ. මෙම අවස්ථාවම පසුව ඇති සියලුම ඉල්ලීම් මගින් භාවිතා කරයි. එබැවින් පොදුවේ ගත් කල, සිංගල්ටන් සේවාවක් නිර්මාණය වන්නේ එක් යෙදුමකට එක් වරක් පමණක් වන අතර එම තනි අවස්ථාව යෙදුමේ ජීවිත කාලය පුරාම භාවිතා වේ.

AddTransient () - මෙම ක්‍රමය මඟින් අස්ථිර සේවාවක් නිර්මාණය කරයි. අස්ථිර සේවාවක් ඉල්ලා සිටින සෑම අවස්ථාවකම නව අවස්ථාවක් නිර්මාණය වේ.

AddScoped () - මෙම ක්‍රමය මඟින් විෂය පථයක් නිර්මාණය කරයි. විෂය පථය තුළ ඉල්ලීමකට වරක් විෂය පථ සේවාවක නව අවස්ථාවක් නිර්මාණය වේ. උදාහරණයක් ලෙස, වෙබ් යෙදුමක දී එය එක් එක් http ඉල්ලීමකට එක් අවස්ථාවක් නිර්මාණය කරන නමුත් එම වෙබ් ඉල්ලීම තුළම අනෙක් ඇමතුම් වලදී එකම අවස්ථාව භාවිතා කරයි.


1

මෙහි විස්තර කර ඇති පරිදි (මෙම සබැඳිය ඉතා ප්‍රයෝජනවත් වේ) උදාහරණයක් සමඟ,

අතුරුමුහුණත සහ කොන්ක්‍රීට් වර්ගය අතර මෙම සිතියම්ගත කිරීම අර්ථ දක්වන්නේ, ඔබ සෑම විටම IContryService වර්ගයක් ඉල්ලා සිටින විට, ඔබට රට සේවයේ නව අවස්ථාවක් ලැබෙනු ඇති බවයි. මෙම නඩුවේ අස්ථිර අර්ථය මෙයයි. ඔබට සිංගල්ටන් සිතියම් (AddSingleton භාවිතා කරමින්) සහ විෂය පථ සිතියම් (AddScoped භාවිතා කරමින්) එකතු කළ හැකිය. මෙම නඩුවේ විෂය පථය යන්නෙන් අදහස් කරන්නේ HTTP ඉල්ලීමකට විෂය පථය යෙදීමයි, එයින් අදහස් වන්නේ වර්තමාන ඉල්ලීම ක්‍රියාත්මක වන විට එය තනි පුද්ගලයකු බවයි. AddInstance ක්‍රමය භාවිතා කරමින් ඔබට DI කන්ටේනරයට දැනට පවතින අවස්ථාවක් එකතු කළ හැකිය. IServiceCollection වෙත ලියාපදිංචි වීමට ආසන්න වශයෙන් සම්පූර්ණ ක්‍රම මේවාය

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.