Programmēšana

Kā izmantot vadības inversiju C #

Gan vadības inversija, gan atkarības ievadīšana ļauj pārtraukt atkarības starp lietojumprogrammas komponentiem un padarīt jūsu lietojumprogrammu vieglāk testējamu un uzturamu. Tomēr kontroles inversija un atkarības injicēšana nav vienādas - starp tām ir smalkas atšķirības.

Šajā rakstā mēs pārbaudīsim vadības modeļa inversiju un sapratīsim, kā tas atšķiras no atkarības ievadīšanas, izmantojot attiecīgus kodu piemērus C #.

Lai strādātu ar šajā rakstā sniegtajiem kodu piemēriem, sistēmā jābūt instalētai Visual Studio 2019. Ja jums vēl nav kopijas, varat lejupielādēt Visual Studio 2019 šeit.

Visual Studio izveidojiet konsoles lietojumprogrammas projektu

Vispirms izveidosim .NET Core konsoles lietojumprogrammas projektu Visual Studio. Pieņemot, ka Visual Studio 2019 ir instalēta jūsu sistēmā, veiciet tālāk norādītās darbības, lai Visual Studio izveidotu jaunu .NET Core konsoles lietojumprogrammas projektu.

  1. Palaidiet Visual Studio IDE.
  2. Noklikšķiniet uz “Izveidot jaunu projektu”.
  3. Logā “Izveidot jaunu projektu” parādīto veidņu sarakstā atlasiet “Console App (.NET Core)”.
  4. Noklikšķiniet uz Tālāk.
  5. Nākamajā logā “Konfigurēt jauno projektu” norādiet jaunā projekta nosaukumu un vietu.
  6. Noklikšķiniet uz Izveidot.

Tādējādi Visual Studio 2019 tiks izveidots jauns .NET Core konsoles lietojumprogrammas projekts. Mēs izmantosim šo projektu, lai izpētītu vadības inversiju šī raksta nākamajās sadaļās.

Kas ir vadības inversija?

Vadības inversija (IoC) ir dizaina modelis, kurā programmas vadības plūsma tiek apgriezta. Varat izmantot vadības modeļa inversijas priekšrocības, lai atdalītu lietojumprogrammas komponentus, apmainītu atkarības ieviešanu, izspēlētu atkarības un padarītu lietojumprogrammu modulāru un pārbaudāmu.

Atkarības ievadīšana ir vadības principa inversijas apakškopa. Citiem vārdiem sakot, atkarības ievadīšana ir tikai viens no vadības inversijas ieviešanas veidiem. Varat arī ieviest vadības inversiju, piemēram, izmantojot notikumus, delegātus, veidnes modeli, rūpnīcas metodi vai pakalpojumu lokatoru.

Vadības dizaina modeļa inversija norāda, ka objektiem nevajadzētu radīt objektus, no kuriem tie ir atkarīgi, lai veiktu kādu darbību. Tā vietā viņiem vajadzētu iegūt šos objektus no ārpakalpojuma vai konteinera. Ideja ir analoga Holivudas principam, kas saka: "Nezvaniet mums, mēs jums piezvanīsim." Piemēram, tā vietā, lai lietojumprogramma izsauktu metodes sistēmā, ietvars izsauktu lietojumprogrammas nodrošināto ieviešanu.

Kontroles piemēra inversija C #

Pieņemsim, ka veidojat pasūtījumu apstrādes lietojumprogrammu un vēlaties ieviest reģistrēšanu. Vienkāršības labad pieņemsim, ka žurnāla mērķis ir teksta fails. Logā Solution Explorer atlasiet tikko izveidoto konsoles lietojumprogrammas projektu un izveidojiet divus failus ar nosaukumu ProductService.cs un FileLogger.cs.

  publiskā klase ProductService

    {

privāts tikai lasāms FileLogger _fileLogger = jauns FileLogger ();

public void žurnāls (virknes ziņojums)

        {

_fileLogger.Log (ziņojums);

        }

    }

publiskā klase FileLogger

    {

public void žurnāls (virknes ziņojums)

        {

Console.WriteLine ("Inside Log metode FileLogger.");

LogToFile (ziņojums);

        }

private void LogToFile (virknes ziņojums)

        {

Console.WriteLine ("Metode: LogToFile, Teksts: {0}", ziņojums);

        }

    }

Īstenošana, kas parādīta iepriekšējā koda fragmentā, ir pareiza, taču tam ir ierobežojums. Jums ir jāierobežo datu reģistrēšana tikai teksta failā. Jūs nekādā veidā nevarat reģistrēt datus citos datu avotos vai citos žurnāla mērķos.

Neelastīga mežizstrādes ieviešana

Ko darīt, ja vēlaties reģistrēt datus datu bāzes tabulā? Esošā ieviešana to neatbalstīs, un jūs būsiet spiests mainīt ieviešanu. Jūs varētu mainīt klases FileLogger ieviešanu vai arī izveidot jaunu klasi, teiksim, DatabaseLogger.

    publiskā klase DatabaseLogger

    {

public void žurnāls (virknes ziņojums)

        {

Console.WriteLine ("Inside Log metode DatabaseLogger.");

LogToDatabase (ziņojums);

        }

private void LogToDatabase (virknes ziņojums)

        {

Console.WriteLine ("Metode: LogToDatabase, Teksts: {0}", ziņojums);

        }

    }

Jūs pat varētu izveidot klases DatabaseLogger gadījumu instancē ProductService, kā parādīts zemāk esošajā koda fragmentā.

publiskā klase ProductService

    {

privāts tikai lasāms FileLogger _fileLogger = jauns FileLogger ();

privāts tikai lasāms DatabaseLogger _databaseLogger =

jauna DatabaseLogger ();

public void LogToFile (virknes ziņojums)

        {

_fileLogger.Log (ziņojums);

        }

public void LogToDatabase (virknes ziņojums)

        {

_fileLogger.Log (ziņojums);

        }

    }

Lai gan tas darbotos, kā būtu, ja jums būtu jāpiesaka lietojumprogrammas dati EventLog? Jūsu noformējums nav elastīgs, un jūs būsiet spiests mainīt ProductService klasi katru reizi, kad būs jāpiesakās jaunā žurnāla mērķī. Tas ir ne tikai apgrūtinoši, bet arī ļoti sarežģīs laika gaitā pārvaldīt ProductService klasi.

Pievienojiet elastību, izmantojot saskarni

Šīs problēmas risinājums ir izmantot saskarni, kuru ieviestu betona reģistrētāju klases. Šis koda fragments parāda interfeisu ar nosaukumu ILogger. Šo interfeisu ieviesīs divas konkrētās klases FileLogger un DatabaseLogger.

publiskā saskarne ILogger

{

void Log (virknes ziņojums);

}

Tālāk ir dotas atjaunotās FileLogger un DatabaseLogger klases versijas.

publiskā klase FileLogger: ILogger

    {

public void žurnāls (virknes ziņojums)

        {

Console.WriteLine ("FileLogger iekšējā žurnāla metode".);

LogToFile (ziņojums);

        }

private void LogToFile (virknes ziņojums)

        {

Console.WriteLine ("Metode: LogToFile, Teksts: {0}", ziņojums);

        }

    }

publiskā klase DatabaseLogger: ILogger

    {

public void žurnāls (virknes ziņojums)

        {

Console.WriteLine ("Inside Log metode DatabaseLogger.");

LogToDatabase (ziņojums);

        }

private void LogToDatabase (virknes ziņojums)

        {

Console.WriteLine ("Metode: LogToDatabase, Teksts: {0}", ziņojums);

        }

    }

Tagad, kad nepieciešams, varat izmantot vai mainīt ILogger saskarnes konkrēto ieviešanu. Šis koda fragments parāda ProductService klasi ar žurnāla metodes ieviešanu.

publiskā klase ProductService

    {

public void žurnāls (virknes ziņojums)

        {

ILogger logger = jauns FileLogger ();

logger.Log (ziņojums);

        }

    }

Tik tālu, labi. Tomēr, kā rīkoties, ja klases ProductService žurnāla metodē vēlaties izmantot DatabaseLogger FileLogger vietā? Jūs varētu mainīt žurnāla metodes ieviešanu klasē ProductService, lai tas atbilstu prasībām, taču tas nepadara dizainu elastīgu. Tagad padarīsim dizainu elastīgāku, izmantojot vadības inversiju un atkarības ievadīšanu.

Apgrieziet vadību, izmantojot atkarības injekciju

Šis koda fragments parāda, kā jūs varat izmantot atkarības injekcijas priekšrocības, lai nodotu konkrētas reģistrētāja klases instanci, izmantojot konstruktora injekciju.

publiskā klase ProductService

    {

privāts tikai lasāms ILogger _logger;

public ProductService (ILogger reģistrētājs)

        {

_logger = reģistrētājs;

        }

public void žurnāls (virknes ziņojums)

        {

_logger.Log (ziņojums);

        }

    }

Visbeidzot, redzēsim, kā mēs varam nodot ILogger saskarnes ieviešanu ProductService klasei. Šis koda fragments parāda, kā jūs varat izveidot FileLogger klases instanci un izmantot konstruktora injekciju, lai nodotu atkarību.

static void Main (virkne [] args)

{

ILogger logger = jauns FileLogger ();

ProductService productService = jauns ProductService (reģistrētājs);

productService.Log ("Sveika pasaule!");

}

To darot, mēs esam apgriezuši kontroli. Klase ProductService vairs nav atbildīga par ILogger saskarnes ieviešanas instances izveidi vai pat par to, kura ILogger saskarnes ieviešana jāizmanto.

Vadības inversija un atkarības ievadīšana palīdz jums veikt objektu automātisko atjaunošanu un dzīves cikla pārvaldību. ASP.NET Core ietver vienkāršu, iebūvētu vadības konteinera inversiju ar ierobežotu funkciju kopumu. Šo iebūvēto IoC konteineru varat izmantot, ja jūsu vajadzības ir vienkāršas, vai izmantojiet trešās puses konteineru, ja vēlaties izmantot papildu funkcijas.

Jūs varat lasīt vairāk par to, kā strādāt ar vadības inversiju un atkarības injicēšanu ASP.NET Core, manā iepriekšējā ziņojumā šeit.

$config[zx-auto] not found$config[zx-overlay] not found