Перехоплювач (шаблон проєктування)

Приклад перехоплювача

Перехоплювач (англ. Interceptor) — шаблон проєктування, який використовують коли система хоче надати альтернативний спосіб виконання, або доповнити чинний цикл виконання додатковими операціями.

Важливо розуміти, що зміни є прозорими та використовується автоматично. По суті, решта системи не повинна знати, що щось додано або змінено, і може продовжувати працювати як раніше. Аби реалізувати цю логіку необхідно мати інтерфейс перехоплювача, який можна реалізувати та вбудувати у систему. Реєстрація перехоплювачів може відбуватись, під час компіляції або виконання програми або ж за допомогою конфігурацій. Важливо також, щоб перехоплювач отримував стан систему через вхідні параметри, та при потребі міг їх міняти.

Реалізація

Нехай дана система, яка реалізує клієнт-серверну архітектуру та автентифікацію за допомогою json web токенів. Тоді необхідно у кожний HTTP-запит додати токен. Щоб запобігти змінам у багатьох компонентах системи, напишемо перехоплювач HTTP-запитів, який буде додавати токен в заголовки запиту.

export class AddAuthHeaderInterceptor implements HttpInterceptor {
  constructor(private authService: AuthService) {}

  public intercept<T>(req: HttpRequest<T>, next: HttpHandler): Observable<HttpEvent<T>> {
    return this.authService.getCurrentUserToken().pipe(
      mergeMap(token => {
        const clonedRequest = req.clone({
          setHeaders: {
            Authorization: `Bearer ${token}`
          }
        });

        // передаємо копію запиту, а не оригінал, наступному обробнику
        return next.handle(clonedRequest);
      })
    );
  }
}

// реєстрація перехоплювача
@NgModule({
  providers: [
    AuthService,
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AddAuthHeaderInterceptor,
      multi: true,
    },
  ],
})
export class AppModule {}

Подібного можна досягнути при взаємодії сервера з іншим сервером.

public class HttpClientAuthorizationDelegatingHandler : DelegatingHandler
{
    private readonly IHttpContextAccessor _httpContextAccesor;

    public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor)
    {
        _httpContextAccesor = httpContextAccesor;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string authorizationHeader = _httpContextAccesor.HttpContext.Request.Headers["Authorization"];

        if (!string.IsNullOrEmpty(authorizationHeader))
        {
            request.Headers.Add("Authorization", new List<string>() { authorizationHeader });
        }

        string token = await GetToken();

        if (token != null)
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }

        return await base.SendAsync(request, cancellationToken);
    }

    private Task<string> GetToken()
    {
        const string ACCESS_TOKEN = "access_token";

        return _httpContextAccesor.HttpContext.GetTokenAsync(ACCESS_TOKEN);
    }
}

// та реєстрація
services
	.AddHttpClient<IServerApiClient, ServerHttpClient>()
	.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>();

Якщо нам необхідно додати логіку трасування про збереження об'єктів у базу даних при цьому не змінюючи чинний функціонал, ми також можемо написати перехоплювач метода.

public class MySaveChangesInterceptor : SaveChangesInterceptor
{
    public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result)
    {
        Console.WriteLine($"Зберігаємо зміни для {eventData.Context.Database.GetConnectionString()}");

        return result;
    }

    public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = new CancellationToken())
    {
        Console.WriteLine($"Зберігаємо зміни асинхронно для {eventData.Context.Database.GetConnectionString()}");

        return new ValueTask<InterceptionResult<int>>(result);
    }
}

// та реєстрація
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .AddInterceptors(new MySaveChangesInterceptor());
}

Даний шаблон також може бути корисний у системах орієнтованих на обробку повідомлень.

Див. також

Джерела

Read other articles:

Arondisemen ke-18 Paris 18e arrondissement de ParisArondisemen kotaBasilika Sacré Cœur yang ada di puncak Montmartre Lambang kebesaranLokasi di wilayah ParisKoordinat: 48°53′32″N 2°20′40″E / 48.89222°N 2.34444°E / 48.89222; 2.34444Koordinat: 48°53′32″N 2°20′40″E / 48.89222°N 2.34444°E / 48.89222; 2.34444NegaraPrancisRegionÎle-de-FranceDepartemenParisKomuneParisPemerintahan • Walikota (2020–2026) Éric...

 

Polish animated television series The sculpture of the main characters of Zaczarowany ołówek in Łódź. Zaczarowany ołówek (Enchanted Pencil) is a Polish cartoon from 1964 to 1976 made by Se-ma-for.[1] The series had no dialogue. It tells a story of a boy named Piotr (Peter) and his dog, aided by an enchanted pencil, which can materialize anything they draw.[1] There were 39 episodes total.[1] The first 26 episodes have no linking story, but the last 13 are center...

 

KavurmaLamb kavurmaNama lainSac kavurmaJenisTumisTempat asalTurkiBahan utamaDaging, bawang, lemak, mericaSunting kotak info • L • BBantuan penggunaan templat ini  Media: Kavurma Kavurma adalah jenis hidangan daging goreng atau tumis yang ditemukan dalam masakan Turki. Namanya juga mengacu pada versi kalengan atau diawetkan dari hidangan serupa, disiapkan dengan menggoreng daging secara kering untuk mengurangi lemaknya.[1] Etimologi Namanya berasal dari kata Turk...

Voce principale: Qualificazioni al campionato mondiale di calcio 2014 - UEFA. Qualificazioni al campionato mondiale di calcio 2014 - UEFA - Fase a gironi, gruppo F Competizione Campionato mondiale di calcio Sport Calcio Edizione 2014 Organizzatore FIFA Date dal 7 settembre 2012al 15 ottobre 2013 Partecipanti 6 Statistiche Miglior marcatore Tomer HemedEden Ben Basat (6) Incontri disputati 30 Gol segnati 82 (2,73 per incontro) Pubblico 606 411 (20 214 per incontro) ...

 

American college football season 2019 UConn Huskies footballConferenceAmerican Athletic ConferenceDivisionEast DivisionRecord2–10 (0–8 American)Head coachRandy Edsall (15th season)Offensive coordinatorFrank Giufre (1st season)Offensive schemeMultipleDefensive coordinatorLou Spanos (1st season)Base defense4–3Home stadiumRentschler FieldSeasons← 20182020 → 2019 American Athletic Conference football standings vte Conf Overall Team   ...

 

Data transfer program by Google Nearby ShareNearby Share running on Android after sending an imageDeveloper(s)Google LLCInitial releaseAugust 4, 2020; 3 years ago (2020-08-04)Operating systemAndroid Marshmallow and laterChromeOS 91 and laterWindows 10 and later (only x86-64 version)PredecessorAndroid BeamSuccessorQuick ShareTypeUtility softwareLicenseProprietary Nearby Share was a functionality developed by Google that allows data to be transferred between devices via Blueto...

此條目可参照英語維基百科相應條目来扩充。 (2023年12月1日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 此條目需要补充更多来源。 (2021年4月4日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能�...

 

Galaxy in the constellation Pisces NGC 318SDSS image of NGC 318Observation data (J2000 epoch)ConstellationPiscesRight ascension00h 58m 05.2s[1]Declination+30° 25′ 32″[1]Redshift0.017702[1]Heliocentric radial velocity5,307 km/s[1]Apparent magnitude (V)15.2[1]CharacteristicsTypeS0[2]Apparent size (V)0.50' × 0.20'[1]Other designationsCGCG 501-054, 2MASX J00580522+3025323, 2MASXi J0058052+302532, PGC 346...

 

Sporting event delegationChina at the2004 Summer ParalympicsIPC codeCHNNPCChina Administration of Sports for Persons with DisabilitiesWebsitewww.caspd.org.cnin AthensCompetitors200 in 11[1] sportsMedalsRanked 1st Gold 63 Silver 46 Bronze 32 Total 141 Summer Paralympics appearances (overview)19841988199219962000200420082012201620202024 China competed at the 2004 Summer Paralympics, held in Athens, Greece. China topped the medal table for the first time, becoming the first Asian country...

PunchdrunkCompany typeTheatre companyIndustryArts & EntertainmentFounded2000FounderFelix BarrettHeadquartersWoolwich, London, United KingdomWebsitepunchdrunk.com Punchdrunk is a British theatre company, formed in 2000 by Felix Barrett.[1] The company developed a form of immersive theatre in which no audience member will have the same experience as another. The audience is free to choose what to watch and where to go.[2][3][4] The format is related to prome...

 

NGC 772 La galaxie spirale NGC 772 Données d’observation(Époque J2000.0) Constellation Bélier Ascension droite (α) 01h 59m 19,6s[1] Déclinaison (δ) 19° 00′ 27″ [1] Magnitude apparente (V) 10,3 [2]11,1 dans la Bande B[2] Brillance de surface 14,03 mag/am2[2] Dimensions apparentes (V) 7,2′ × 4,3′ [2][2] Décalage vers le rouge +0,008146 ± 0,000010[1] Angle de position 130° [2] Localisation dans la constellation : Bélier Astrométr...

 

Militaristic culture present in Germany between 1815 and 1945 This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: German militarism – news · newspapers · books · scholar · JSTOR (March 2023) (Learn how and when to remove this message) After the Battle of Sedan 1870 (General Reille hands King Wilhelm a letter by ...

هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها.   لمعانٍ أخرى، طالع يوجا (توضيح). جزء من سلسلة مقالات عنالهندوسية هندوس تاريخ آلهة تريمورتي براهما فيشنو شيفا الديفي والديفا ساراسواتي لاكشمي بارفاتي شاكتي دورغا كالي غ�...

 

أدريان جوستين   معلومات شخصية الميلاد 11 يناير 1961 (العمر 63 سنة) الطول 5 قدم 6 بوصة (1.68 م)[1][1] مركز اللعب لاعب وسط  الجنسية المملكة المتحدة  معلومات النادي النادي الحالي مينيسوتا يونايتد (head coach) المسيرة الاحترافية1 سنوات فريق م. (هـ.) 1979–1982 ستوك سيتي 95 (16) 198...

 

Political strategy This article's lead section may be too short to adequately summarize the key points. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. (October 2022) Respectability politics, or the politics of respectability, is a political strategy wherein members of a marginalized community will consciously abandon or punish controversial aspects of their cultural-political identity as a method of assimilating, achieving social ...

Book by Ayu Utami Saman AuthorAyu UtamiLanguageIndonesianGenreNovelPublisherKepustakaan Populer GramediaPublication date1998Publication placeIndonesiaMedia typePrint (hardback & paperback)Pages195 (19th printing)ISBN978-979-9023-17-9 (19th printing)OCLC67023545Followed byLarung  Saman is an Indonesian novel by Ayu Utami published in 1998. It is Utami's first novel, and depicts the lives of four sexually-liberated female friends, and a former Catholic priest, Saman, for whom...

 

This article includes a list of references, related reading, or external links, but its sources remain unclear because it lacks inline citations. Please help improve this article by introducing more precise citations. (February 2019) (Learn how and when to remove this message) David E. McGiffertAssistant Secretary of Defense for International Security AffairsIn officeApril 4, 1977 – January 20, 1981PresidentJimmy CarterPreceded byEugene V. McAuliffeSucceeded byBing WestUnited State...

 

兵庫県加古郡稲美町の「千波池」とは異なります。 千波湖 国土地理院2012年10月13日撮影所在地 日本 茨城県水戸市位置 北緯36度22分12秒 東経140度27分35秒 / 北緯36.37度 東経140.4597度 / 36.37; 140.4597座標: 北緯36度22分12秒 東経140度27分35秒 / 北緯36.37度 東経140.4597度 / 36.37; 140.4597面積 約0.332 km2周囲長 3.0 km最大水深 約1.2 m平均水深 約1.0 m貯水量...

Supreme Court of the United StatesWarren CourtVinson Court ← → Burger CourtOctober 5, 1953 – June 23, 1969(15 years, 261 days)SeatSupreme Court BuildingWashington, D.C.No. of positions9Warren Court decisions This is a partial chronological list of cases decided by the United States Supreme Court during the Warren Court, the tenure of Chief Justice Earl Warren, from October 5, 1953, through June 23, 1969. Case name Focus Citation Summary Toolson v. New York Yankees, ...

 

Conduit between embryo/fetus and the placenta Not to be confused with Umbilical cable. Umbilical cordUmbilical cord of a three-minute-old baby. A medical clamp has been applied.DetailsIdentifiersLatinfuniculus umbilicalisMeSHD014470TEcord_by_E6.0.2.2.0.0.1 E6.0.2.2.0.0.1 Anatomical terminology[edit on Wikidata] In placental mammals, the umbilical cord (also called the navel string,[1] birth cord or funiculus umbilicalis) is a conduit between the developing embryo or fetus and the ...