Vra

Ek het al met behulp van StructureMap onlangs en het dit geniet om die ervaring deeglik.Egter, ek kan sien hoe kan'n mens maklik meegevoer met die skakeling alles uit en eindig met klasse wat in'n boatload van koppelvlakke in hul vervaardigerskampioenskap.Selfs al is dit is regtig nie'n groot probleem wanneer jy met behulp van'n afhanklikheid inspuiting raamwerk, is dit nog steeds voel dat daar sekere eienskappe wat regtig hoef nie te word gekoppel uit net vir die wille van skakeling hulle.

Waar trek jy die lyn op wat om te koppelvlak uit vs net die toevoeging van'n eiendom aan die klas?

Was dit nuttig?

Oplossing

Dink aan jou ontwerp. DI kan jy verander hoe jou kode funksies via opset veranderinge. Dit laat jou ook toe om afhanklikhede breek tussen klasse sodat jy kan isoleer en toets voorwerpe makliker te maak. Jy het om vas te stel waar dit maak sin en waar is dit nie. Daar is geen klop antwoord.

'n Goeie reël is dat as dit te moeilik om te toets, het jy 'n paar probleme met enkele verantwoordelikheid en statiese afhanklikhede. Isoleer kode wat 'n enkele funksie verrig in 'n klas en breek dat statiese afhanklikheid deur gebruik 'n koppelvlak en met behulp van 'n DI raamwerk om die korrekte geval spuit tydens looptyd. Deur dit te doen, jy maak dit triviaal om die twee dele afsonderlik te toets.

Ander wenke

Die grootste probleem met afhanklikheid inspuiting is dat, terwyl dit die voorkoms van 'n losweg gekoppel argitektuur gee, dit regtig doen nie.

Wat jy regtig doen beweeg dat koppeling van die kompilering om die runtime, maar nog steeds as klas A moet 'n paar koppelvlak B te werk, 'n geval van 'n klas wat implemente koppelvlak B moet nog verskaf word.

Afhanklikheid inspuiting moet slegs gebruik word vir die dele van die program wat moet dinamies verander word sonder hercompileren die basis-kode.

Gebruik wat ek nuttig gesien vir 'n Inversie van Beheer patroon:

  • 'n plugin argitektuur. So deur die maak van die reg inskrywing punte wat jy kan die kontrak vir die diens wat verskaf moet word te definieer.
  • Workflow-agtige argitektuur. Waar jy 'n paar komponente dinamiese koppeling van die opbrengs van 'n komponent om die insette van 'n ander een kan koppel.
  • Per-kliënt aansoek. Kom ons sê jy het verskeie kliënte wat betaal vir 'n stel van "eienskappe" van jou projek. Deur die gebruik van afhanklikheid inspuiting kan jy maklik te voorsien net die kern komponente en 'n paar komponente wat net die funksies van die kliënt betaal het voorsien "bygevoeg".
  • vertaal. Alhoewel dit nie gewoonlik gedoen vir vertaling doeleindes, kan jy "spuit" n ander taal lêers as wat nodig is deur die aansoek. Dit sluit RTL of LTR gebruikerkoppelvlakke as wat nodig is.
  

Afhanklikheid inspuiting moet slegs gebruik word vir die dele van die   aansoek wat aangespreek moet dinamies verander word sonder hercompileren   die basis-kode

DI moet gebruik word om jou kode uit eksterne bronne te isoleer (databasisse, webservices, XML-lêers, plugin argitektuur). Die bedrag van die tyd wat dit sal neem om jou logika in kode te toets sou byna verbod op 'n baie maatskappye wees as jy die toets van komponente wat afhanklik is van 'n databasis.

In die meeste aansoeke die databasis is nie van plan om dinamies verander (hoewel dit kan) maar oor die algemeen is dit byna altyd goeie praktyk om NIE jou aansoek om 'n bepaalde eksterne hulpbron te bind. Die bedrag behels in die verandering van hulpbronne moet laag wees (toegang data klasse moet selde 'n cyclomatic kompleksiteit bo een in dit se metodes).

Wat bedoel jy met "net die toevoeging van 'n eiendom aan 'n klas?"

My reël is om die klaseenheid toetsbaar te maak. As jou klas staatmaak op die implementering besonderhede van 'n ander klas, wat moet refactored / onttrek aan die punt dat die klasse getoets kan word in isolasie nie.

EDIT: Jy noem 'n bootsvrag van koppelvlakke in die constructor. Ek sou raai die gebruik van etters / getters plaas. Ek vind dat dit maak dinge baie makliker om in stand te hou in die lang termyn.

Ek doen dit net wanneer dit help met skeiding van kommer.

Soos miskien kruis-projek sou ek 'n koppelvlak vir implementeerders verskaf in een van my biblioteek projek en die implementering van die projek sal spuit alles spesifieke implementering hulle wil in.

Maar dit is oor dit ... al die ander gevalle is dit sal net maak die stelsel onnodig kompleks

Selfs met al die feite en prosesse in die wêreld .. elke besluit kom neer op 'n oordeel oproep - vergeet waar ek lees dat
Ek dink dit is meer van 'n ervaring / vlug tyd oproep. Basies as jy die afhanklikheid as 'n kandidaat voorwerp wat kan vervang word in die nabye toekoms te sien, gebruik afhanklikheid inspuiting. As ek sien 'classA en sy afhanklikes' as een blokkie vir vervanging, dan het ek waarskynlik nie gebruik DI vir VVPA A se.

Die grootste voordeel is dat dit sal help om te verstaan of selfs ontbloot die argitektuur van jou aansoek.Jy sal in staat wees om baie duidelik te sien hoe jou afhanklikheid kettings werk en in staat wees om veranderinge te maak aan die individuele dele sonder dat jy om dinge te verander wat onverwante.Jy sal eindig met'n losweg tesame aansoek.Dit sal druk jou in'n beter ontwerp en jy sal verbaas wees wanneer jy kan hou die maak van verbeterings, want jou ontwerp sal jou help jy hou skei en organisering kode vorentoe.Dit kan ook fasiliteer eenheid toets want jy het nou'n natuurlike manier te vervang implementering van bepaalde koppelvlakke.

Daar is'n paar programme wat net weggooi nie, maar as daar'n twyfel ek sal voort te gaan en die skep van die koppelvlakke.Na'n paar praktyk dit is nie veel van'n las.

Nog 'n item wat ek worstel met is waar moet ek afhanklikheid inspuiting gebruik? Waar kry jy jou afhanklikheid van StructureMap neem? Net in die begin aansoek? Beteken dit al die implementering moet al die pad af ingehandig van die top-mees laag op die bodem mees laag?

Ek gebruik Castle Windsor / mikrokern, ek het geen ondervinding met enigiets anders, maar ek wil dit baie.

As vir hoe besluit jy wat om te spuit? Tot dusver het die volgende reël het my goed gedien: As die klas is so eenvoudig dat dit nie eenheid toetse nodig het, kan jy vry om dit instansieer in die klas voel, anders waarskynlik wil hê jy moet 'n afhanklikheid deur die konstruktor het.

As vir of jy 'n koppelvlak vs net die maak van jou metodes en eienskappe virtuele moet skep ek dink jy moet die koppelvlak roete gaan óf as jy óf a) kan die klas sien het 'n sekere vlak van herbruikbaarheid in 'n ander aansoek (dit wil sê 'n logger ) of b) indien hetsy as gevolg van die bedrag van constructor parameters of omdat daar 'n beduidende bedrag van logika in die konstruktor, die klas is anders moeilik om Hom te bespot.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top