Ilman riippuvuutta injectionEdit
seuraavat Java esimerkki, Asiakas-luokka sisältää Palvelun jäsen muuttuja, joka on alustettu Asiakkaan rakentaja. Asiakas valvoo, mitä palvelun toteutusta käytetään ja valvoo sen rakentamista. Tässä tilanteessa asiakkaalla sanotaan olevan kovasanainen riippuvuus Tenttipalvelusta.
// An example without dependency injectionpublic class Client { // Internal reference to the service used by this client private ExampleService service; // Constructor Client() { // Specify a specific implementation in the constructor instead of using dependency injection service = new ExampleService(); } // Method within this client that uses the services public String greet() { return "Hello " + service.getName(); }}
Riippuvuus injektio on vaihtoehtoinen tekniikka alustaa jäsen muuttuja sijaan nimenomaisesti luoda palvelu-objekti kuten edellä on osoitettu., Voimme säätää esimerkiksi käyttämällä eri tekniikoita kuvattu ja havainnollistettu kohdissa alla.
Tyypit riippuvuus injectionEdit
On olemassa ainakin kolme tapaa asiakasta objekti voi saada viittaus ulkoiseen moduuli:
rakentaja injektio riippuvuudet ovat kautta asiakkaan luokan rakentaja. setter injection asiakas altistaa setter menetelmä, että injektori käyttää pistää riippuvuus. käyttöliittymä injektio riippuvuus käyttöliittymä tarjoaa injector menetelmä, joka pistää riippuvuus mihin tahansa asiakkaan kulunut., Asiakkaiden on toteutettava käyttöliittymä, joka paljastaa setter-menetelmän, joka hyväksyy riippuvuuden.
Muut typesEdit
on mahdollista, DI puitteet ovat muita injektio pidemmälle kuin edellä on esitetty.
Testauskehyksissä voidaan käyttää myös muita tyyppejä. Jotkut nykyaikaiset testaus puitteet eivät edes vaatia, että asiakkaat aktiivisesti hyväksyä riippuvuus injektio, jolloin vanhan koodin testattavissa. Erityisesti Java-kieltä on mahdollista käyttää harkinta tehdä yksityisiä attribuutteja julkinen, kun testaus-ja siten hyväksyä injektionesteisiin tehtävän.,
Jotkut yritykset Inversion of Control eivät tarjota täydellinen poistaminen riippuvuutta, mutta sen sijaan yksinkertaisesti korvata yksi muoto riippuvuuden toiseen. Koska nyrkkisääntö, jos ohjelmoija voi katsoa mitään, mutta asiakkaan koodi ja kerro mitä kehystä käytetään, niin asiakas on hard-koodattu riippuvuutta puitteissa.
Rakentaja injectionEdit
Tämä menetelmä edellyttää, että asiakas antaa parametrina rakentajalle riippuvuutta.
Setteri injectionEdit
Tämä menetelmä edellyttää, että asiakas antaa setteri menetelmä riippuvuutta.,
Käyttöliittymä injectionEdit
Tämä on yksinkertaisesti asiakkaan publishing rooli käyttöliittymä setteri menetelmiä asiakkaan riippuvuudet. Sen avulla voidaan määrittää, miten injektorin tulee puhua asiakkaalle, kun pistät riippuvuuksia.
// Service setter interface.public interface ServiceSetter { public void setService(Service service);}// Client classpublic class Client implements ServiceSetter { // Internal reference to the service used by this client. private Service service; // Set the service that this client is to use. @Override public void setService(Service service) { this.service = service; }}
Rakentaja injektio comparisonEdit
Edullinen, kun kaikki riippuvuudet voidaan rakentaa ensin, koska sitä voidaan käyttää varmistamaan, että asiakas objekti on aina voimassa oleva valtio, toisin kuin ottaa joitakin sen riippuvuus viitteet olla null-arvo (ei asetettu)., Se ei kuitenkaan yksin ole tarpeeksi joustava, jotta sen riippuvuudet muuttuisivat myöhemmin. Tämä voi olla ensimmäinen askel kohti asiakkaan muuttumattomuutta ja siten Lanka turvallista.
Setter injection comparisonEdit
edellyttää, että asiakas antaa jokaiselle riippuvuudelle setter-menetelmän. Tämä antaa vapauden manipuloida riippuvuusviittausten tilaa milloin tahansa. Tämä tarjoaa joustavuutta, mutta jos siellä on enemmän kuin yksi riippuvuus ruiskutetaan, se on vaikeaa, asiakas varmistaa, että kaikki riippuvuudet injektoidaan ennen kuin asiakkaalle voidaan tarjota käytettäväksi.,
koska nämä pistokset tapahtuvat itsenäisesti, ei ole mitään keinoa kertoa, milloin injektori on valmis johdotus asiakkaalle. Riippuvuus voidaan jättää nollaan yksinkertaisesti injektorin ei soita sen setter. Tämä pakottaa tarkistamaan, että pistos on suoritettu, Kun asiakas on koottu aina, kun sitä käytetään.
Käyttöliittymä injektio comparisonEdit
etu-liitäntä injektio on, että riippuvuudet voivat olla täysin tietämättömiä asiakkaitaan vielä voi silti saada viittaus uuden asiakkaan ja käyttää sitä, lähetä viittaus-to-self takaisin asiakkaalle., Näin riippuvuudet muuttuvat injektoreiksi. Olennaista on, että pistosmenetelmä (joka voisi olla vain klassinen setter-menetelmä) toimitetaan käyttöliittymän kautta.
assembleria tarvitaan edelleen esittelemään asiakas ja sen riippuvuudet. Kokoajan olisi otettava viittaus asiakkaan, heittää se setteri käyttöliittymä, joka asettaa riippuvuutta, ja siirtää sen, että riippuvuuden kohde, joka olisi kääntyä ympäri ja ohi viite-to-self takaisin asiakkaalle.,
jotta rajapinnan ruiskutuksella olisi arvoa, riippuvuuden on tehtävä jotain sen lisäksi, että se yksinkertaisesti siirtää viittauksen itseensä. Tämä voisi olla toimiva tehdas tai osa-assembler ratkaista muut riippuvuudet, mikä hahmotuskykyyn joitakin yksityiskohtia päässä kokoajan. Se voisi olla referenssilaskenta niin, että riippuvuus tietää, kuinka monta asiakasta sitä käyttää. Jos riippuvuutta ylläpitää kokoelma asiakkaita, se voi myöhemmin pistää ne kaikki eri oikeusasteen tuomioistuin itse.,
exampleseditin kokoaminen
käsin käsin kokoaminen on yksi tapa toteuttaa huoltosuhteen ruiskutus.
esimerkissä rakentaa objekti kaavio manuaalisesti ja käynnistää sitten se jossain vaiheessa alkaa se toimi. On tärkeää huomata, että tämä injektori ei ole puhdas. Se käyttää yhtä rakentamistaan esineistä. Se on puhtaasti rakentaminen-vain suhde ExampleService mutta sekoittaa Rakentaminen ja asiakkaan. Tämän ei pitäisi olla yleistä. Sitä ei kuitenkaan voida välttää., Aivan kuten olio-ohjelmisto tarvitsee ei-olio staattinen menetelmä, kuten main() päästä alkuun, riippuvuus pistetään esine kuvaaja tarvitsee vähintään yksi (mieluiten vain yksi) yhteyspiste saada koko juttu alkoi.
Käyttöohje rakentamisen tärkein menetelmä voi olla tämä suoraviivainen ja voi liittyä soittamalla rakentajia, tehtaiden tai muiden rakentamisen malleja samoin. Tämä voi olla melko kehittynyt ja abstrakti., Linja on ylittänyt manuaalisesta riippuvuus injektio puitteet riippuvuus injektio, kun rakentaa koodi ei ole enää custom sovellus ja on sen sijaan yleinen.
jousen kaltaiset kehykset voivat rakentaa nämä samat objektit ja vaijeroida ne yhteen ennen viittauksen palauttamista asiakkaalle. Kaikki maininta konkreettisesta Koepalvelusta voidaan siirtää koodista konfiguraatiotietoihin.
kevään kaltaiset Kehykset mahdollistavat kokoonpanotietojen ulkoistamisen asetustiedostoissa.Tämä koodi (yllä) rakentaa esineitä ja johdot ne yhteen mukaan Pavut.xml (alla)., ExampleService on edelleen rakennettu, vaikka se on vain mainittu alla. Pitkä ja monimutkainen esine kuvaaja voidaan määritellä näin ja vain luokan mainittu koodi olisi yksi yhteyspiste menetelmä, joka tässä tapauksessa on tervehdi().
yllä olevassa esimerkissä Asiakas ja Palvelu ei ole ollut muutoksia toimitettava viimeistään Keväällä. Ne saavat jäädä pelkiksi Pojoiksi. Tämä osoittaa, kuinka Kevät voi yhdistää palvelut ja asiakkaat, jotka ovat täysin tietämättömiä sen olemassaolosta. Näin ei voisi sanoa, jos luokkiin lisättäisiin Keväthuomautuksia., Pitämällä Kevät-erityisiä merkintöjä ja puhelut ripustus joukossa monia luokkia, järjestelmä pysyy vain löyhästi riippuvainen Keväällä. Tämä voi olla tärkeää, jos järjestelmä aikoo elää kevään yli.
valinta pitää POJOs puhtaana ei tule ilman kustannuksia. Sen sijaan viettää pyrkimyksiä kehittää ja ylläpitää monimutkaisia kokoonpano-tiedostoja, se on mahdollista yksinkertaisesti käyttää merkintöjä merkin luokat ja anna Keväällä tehdä loput työstä. Riippuvuuksien ratkaiseminen voi olla yksinkertaista, jos ne noudattavat yleissopimusta, kuten vastaavuutta tyypin tai nimen mukaan. Tämä on valitsemalla convention yli kokoonpano., Voidaan myös väittää, että kehyskohtaisten huomautusten poistaminen olisi triviaali osa tehtävää ja että monet ruiskutushuomautukset on nyt standardoitu.
@Componentpublic class ExampleService { public String getName() { return "World!"; }}
Kokoonpano comparisonEdit
eri injector toteutukset (tehtaat, palvelu-paikantimet, ja riippuvuus injektio kontit) eivät ole niin erilaisia niin pitkälle kuin riippuvuus injektio on huolissaan. Kaiken eron tekee se, missä niitä saa käyttää., Siirrä puhelut tehtaaseen tai palvelun paikannin ulos asiakkaasta ja osaksi main ja yhtäkkiä main tekee melko hyvä huoltosuhde ruiskutusastia.
siirtämällä kaikki tieto suutin ulos, puhdas, asiakas, vapaa tietoa ulkomaailmaan, on jättänyt jälkeensä. Mitä tahansa objektia, joka käyttää muita esineitä, voidaan kuitenkin pitää asiakkaana. Pääasia ei ole poikkeus. Tämä pääkohde ei käytä huoltosuhdetta. Se todella käyttää palvelun paikannin kuvio. Tätä ei voi välttää, koska palvelutoteutusten valinta on tehtävä jossain.,
riippuvuuksien ulkoistaminen asetustiedostoiksi ei muuta tätä tosiasiaa. Tämän todellisuuden tekee osaksi hyvää suunnittelua se, että palvelupaikkaaja ei ole levinnyt koko koodipohjaan. Se rajoittuu yhteen paikkaan hakemusta kohden. Tämä jättää loput koodin pohja vapaasti käyttää huoltosuhdetta tehdä puhtaita asiakkaita.
Huoltoruiskutus PatternEdit
tähän asti esimerkit ovat olleet liian yksinkertaisia esimerkkejä merkkijonon rakentamisesta., Kuitenkin, riippuvuus injektio kuvio on eniten hyötyä, kun rakentaa objekti kaavio, jossa esineet kommunikoivat viestejä. Pääpiirteissään rakennetut esineet kestävät ohjelman elämää. Tyypillinen kuvio on muodostaa kuviografia ja sitten kutsua yksi menetelmä yhden objektin lähettää virtauksen ohjaus objektin kuvioon. Aivan kuten tärkein on merkintä osoittaa staattinen koodin, tämä menetelmä on yhteyspiste sovelluksia ei-staattinen koodi.,
AngularJS exampleEdit
Vuonna AngularJS puitteet, on vain kolme tapaa osa (esine tai toiminto) ei voi suoraan käyttää sen riippuvuudet:
- komponentti voi luoda riippuvuutta, tyypillisesti käyttäen
new
operaattori. - komponentti voi etsiä riippuvuutta viittaamalla globaaliin muuttujaan.
- komponentin riippuvuus voi siirtyä siihen missä sitä tarvitaan.
kaksi ensimmäistä vaihtoehtoa luoda tai etsii riippuvuudet eivät ole optimaaliset, koska ne kovasti koodi riippuvuus osan., Tämä vaikeuttaa, ellei mahdotonta, riippuvuuksien muokkaamista. Tämä on erityisen ongelmallista testeissä, joissa on usein suotavaa tarjota pilakuvariippuvuutta testieristykseen.
kolmas vaihtoehto on toimivin, koska se poistaa vastuun paikallistamiseen riippuvuus komponentin. Riippuvuus annetaan yksinkertaisesti komponentille.
edellä olevassa esimerkissä SomeClass
ei ole huolissaan luominen tai paikallistamiseen greeter riippuvuus, se on yksinkertaisesti luovutti tervehdin, kun se on instantiated.,
Tämä on toivottavaa, mutta se asettaa vastuun saada kiinni riippuvuutta koodi, joka rakentaa SomeClass
.
hoitaakseen huoltosuhteen syntymisvastuun jokaisessa AngularJS-sovelluksessa on injektori. Injektori on palvelupaikkaaja, joka vastaa riippuvuuksien rakentamisesta ja etsimisestä.
Tässä on esimerkki käyttäen injector-palvelu:
Luo uusi suutin, joka voi tarjota osia määritelty myModule
moduuli ja pyytää meidän greeter-palvelun suutin., (Tämä tapahtuu yleensä automaattisesti AngularJS bootstrap).
var injector = angular.injector();var greeter = injector.get('greeter');
Pyydä riippuvuudet ratkaisee ongelman kovaa koodausta, mutta se tarkoittaa myös sitä, että suutin on kulunut koko sovelluksen. Injektorin ohittaminen rikkoo Demeterin lakia., Voit korjata tämän, käytämme deklaratiivinen merkintä meidän HTML-malleja, käsi vastuu luoda osia yli injector, kuten tässä esimerkissä:
<div ng-controller="MyController"> <button ng-click="sayHello()">Hello</button></div>
function MyController($scope, greeter) { $scope.sayHello = function() { greeter.greet('Hello World'); };}
Kun AngularJS kokoaa HTML, se käsittelee ng-controller
direktiivi, joka puolestaan pyytää injector luoda esimerkiksi rekisterinpitäjän ja sen riippuvuudet.
injector.instantiate(MyController);
Tämä kaikki tapahtuu kulissien takana., Koska ng-controller
siirtyy injector instantiate luokan, se voi tyydyttää kaikki riippuvuudet MyController
ilman ohjain koskaan tietämättä suutin. Sovelluskoodi yksinkertaisesti ilmoittaa riippuvuudet se tarvitsee, ilman käsitellä injektorin. Tämä asetelma ei riko Demeterin lakia.
C# – Muokkaa
Esimerkki Rakentaja injektio, Setteri-injektio ja Käyttöliittymä injektio C#