Teknologian jakaminen

C# IOC-säiliö, riippuvuusinjektio ja ohjauksen inversio

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Ohjauksen inversio (IoC)

määritelmä : Ohjauksen käännös on suunnitteluperiaate, joka kääntää ohjauksen kulkua perinteisessä ohjelmoinnissa. Perinteisissä ohjelmointimalleissa komponenttien väliset riippuvuudet luodaan ja ylläpidetään sisäisesti komponenttien itsensä toimesta. Ohjaustilan käänteessä tätä riippuvuutta hallitsee ulkoinen säilö (kuten Spring-kehys, Microsoft.Extensions.DependencyInjection .NET:ssä jne. Komponentti ei ole enää vastuussa omista riippuvuuksistaan, vaan lisää kaikki riippuvuudet). vaadittujen riippuvuuksien kautta.

pääidea: Siirtää objektien luomisen ja niiden välisten riippuvuuksien hallinnan itse objekteista ulkoisiin säilöihin.

etu

  • Vähennä kytkentää: Komponenttien välisiä riippuvuuksia ei enää koodata, joten komponenttien toteutukset voidaan vaihtaa helpommin, mikä parantaa järjestelmän joustavuutta ja ylläpidettävyyttä.
  • Paranna modulaarisuutta: Yksittäisiä komponentteja voidaan kehittää ja testata itsenäisesti, koska ne eivät perustu tiettyihin toteutuksiin, vaan abstrakteihin rajapintoihin tai abstrakteihin luokkiin.
  • Helppo testata: Koska komponenttien väliset riippuvuudet on ulkoistettu, on helpompaa käyttää valeobjekteja tai testikantoja simuloimaan riippuvuuksia yksikkötestauksessa.

Riippuvuusinjektio (DI)

määritelmä : Riippuvuusinjektio on erityinen tapa saada ohjauksen käänteinen. Se sisältää riippuvuuksien (palvelujen tai objektien) siirtämisen luokkiin sen sijaan, että luokkien annettaisiin luoda niitä itse.

Menetelmä toteuttaa

  • rakentajan ruiskutus : Riippuvuudet tarjotaan luokan rakentajan kautta. Tämä on yleisin ja suositeltu DI-muoto C#:ssa.
  • Kiinteistöinjektio : Määritä riippuvuudet luokan julkisten ominaisuuksien kautta. Tämä lähestymistapa tarjoaa joustavuutta, mutta voi paljastaa sisäisen tilan ja vähentää kapseloitumista.
  • menetelmä injektio : Siirrä riippuvuudet menetelmäparametrien läpi. Soveltuu vain tietyn menetelmän edellyttämien riippuvuuksien injektoimiseen.

IOC-kontti

määritelmä :IOC-kontti on kehys objektien elinkaaren ja riippuvuuksien hallintaan. Se luo automaattisesti objekteja määrityksen perusteella (kuten XML-tiedostot, huomautukset tai koodimääritykset) ja lisää riippuvuuksia näihin objekteihin.

vaikutus

  • Objektin luominen: Luo automaattisesti objektiinstanssit määrityksen perusteella.
  • riippuvuusruiske: Lisää riippuvuuksia objekteihin ohjauksen inversion saavuttamiseksi.
  • elinkaaren hallinta: Hallitse esineiden elinkaarta, mukaan lukien resurssien luominen, tuhoaminen ja kierrätys.

Käytä IOC-säiliöitä riippuvuuksien hallintaan

C#:ssa voit käyttää erilaisia ​​IOC-säilöjä riippuvuuksien hallintaan, kuten Microsoft.Extensions.DependencyInjection (.NET Coren ja uudempien versioiden sisäänrakennettu DI-säilö), Autofac jne. Seuraavassa on esimerkkinä Microsoft.Extensions.DependencyInjection, jolla esitellään, kuinka IOC-säilöjä käytetään riippuvuuksien hallintaan C#-projekteissa.

Vaihe 1: Rekisteröidy palveluun

Palveluita käytetään tyypillisesti .NET-sovelluksissaProgram.cstaiStartup.cs(ASP.NET Core -projekteille), jota käytetäänIServiceCollectionkäyttöliittymä rekisteröintiä varten.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Vaihe 2: Lisää riippuvuuksia

Lisää riippuvuuksia ohjaimeen, palveluun tai mihin tahansa muuhun luokkiin rakentajan kautta.

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Yllä olevassa esimerkissäMyControllerLuokka injektoidaan konstruktorin kauttaIMyServiceKäyttöliittymän toteutus (esim.MyService ystävällinen).Tällä tavalla, milloinMyControllerKun IOC-säilö on luotu, se avautuu automaattisestiIMyServiceToteutus ruiskutetaan konstruktoriin.

Varotoimenpiteet
  • Käytä käyttöliittymäpohjaisia ​​abstraktioita: Suosi liitäntöjä tai abstrakteja luokkia riippuvaisille tyypeille parantaaksesi joustavuutta ja testattavuutta.
  • Vältä singletonin liikakäyttöä: Singleton-palveluita tulee käyttää varoen, jotta vältetään osavaltioon liittyvät ongelmat.
  • Tarkkaile kohteen elinkaarta: Ymmärrä riippuvuuksien elinkaari (yksittäinen, laajuus, ohimenevä) hallitaksesi resurssien käyttöä tehokkaasti.