Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

December 15, 2014 / by Zsolt Soczó

Di kérdés

Adott IA, IB és IC interfész. Implementációk: A, B, C1 és C2, utóbbiak IC-t implementálják. A hívja B-t, A -> B, B viszont IC mindkét implementációját kívánja használni, B -> C1 és B -> C2. Közönséges konstruktor injectionnel nem lehet ezt rendesen összerakni. Mi a javasolt módszer erre?

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

7 COMMENTS

  • attilah December 15, 2014

    hogy kivanja hasznalni mindket implementaciot?

    1. public B (IC c1, IC c2) { … }

    vagy

    2. public B (IC c) { … } es valami runtime dologtol fugg, hogy C1, vagy C2-ot kell injektalni az adott DI scope-ba?

  • Soczó Zsolt December 15, 2014

    B-ben feldolgozok emaileket. Egyeseket azonnal ki kell küldeni, másokat dbbe menteni, mert csak naponta egyszer mennek ki. A IC egy IEmailSender interfész, van igazi email küldő verziója, és van dbbe mentő verziója is. Mindkettőre szükség van, amikor B végigmegy a kiküldendő adatokon.

    Ezt így leírva gondolom, hogy lehet érdemes lenne a IEmailSenderből leszármaztatni egy IPersistentEmailSender és IRealEmailSendert, és ezeket beadni B-nek konstruktor injectionnel.

  • attilah December 15, 2014

    Hat ez esetben mindenkeppen az interface redesign a jobb megoldas. De a kerdesre nem valaszoltal, hogy MITOL fugg, hogy mikor mire van szukseged? de a funkcio alapjan gondolom az 1-es pont az.

    Ott meg tudod csinalni Autofac eseten (legjobb IoC IMHO :-) azt, hogy maskepp regisztralod be a komponenseket ha marad ugyanez az interface akkor is…

    Itt talalsz ra megoldast:

    http://docs.autofac.org/en/latest/faq/select-by-context.html

  • jaccso December 16, 2014

    IC1 -IC2-t, megkulonboztetnem ha neha az egyiket neha a masikat kellene vegrehajtani, igy ket kulon interface-t injektalnek.

    Ha mindig mindkettot vegre kell hajtani, IC[] -t lehet injektalni amiben a regisztralt IC leszarmazottak lesznek. (Castle)

  • Soczó Zsolt December 16, 2014

    jaccso: az interface-ek szétválasztása mellett döntöttem, főleg, mivel nem csak közös részük lesz, hanem szétválasztás után más funkciók is rá fognak kerülni az új interfészre. Először az közös részre figyeltem, de pont a jelentős különbségek miatt értelmetlen lenne egy interfész alá kényszeríteni őket. Ettől még az alap interfész megmarad, hogy a közös funkcionalitást egységesen lehessen kezelni.
    Így már egyszerű contr inj elég lesz.

  • Marci December 18, 2014

    Apró megjegyzés: én mindig elmenteném a db-be az emaileket. Ha nem kapsz exceptiont, attól még millió dolog miatt meghiúsulhat a kézbesítés. Tapasztalat…

  • Soczó Zsolt December 18, 2014

    Köszi Marci, gondoltam erre is, hogy minden emait berakni dbbe, csak egy dátumot írni még hozzá, hogy mikor kell kézbesíteni, így ezzel le lehet játszani tetszőleges frekvenciájú levélküldést, illetve ismételni is lehet, ha mégse ment el.