Avatar billede stephanryer Nybegynder
11. februar 2010 - 13:06 Der er 12 kommentarer

Castle Windsor - MEF like attribute model understøttet?

Jeg har læst mig til, at MEF (http://www.codeplex.com/MEF) understøtter en attribute model til dependency injection. Man markerer altså således:

[Import]
public IConsumer consumer { get; set; }

referencen 'consumer' bliver så sat via MEF frameworket ved instantiering af koden.

Ved brug af Castle Windsor, gør man typisk således:

IConsumer consumer = castleContainer.Resolve<IConsumer>();

Mit spørgsmål:

Har castle windsor en attribute model som MEF's out-of-the-box? Jeg synes ikke at kunne finde noget omkring dette på http://castleproject.org/container/index.html

På forhånd tak.
Avatar billede janus_007 Nybegynder
11. februar 2010 - 20:43 #1
Nu kender jeg ikke til MEF, men konceptet med at attributte sine metoder er ikke videre elegant vil jeg mene og bryder hele DI-idéen.

Et DI-framework skal først og fremmest være "usynligt" i koden, dvs. man skal kunne udskifte DI som man lyster.

Anyway... IConsumer consumer = castleContainer.Resolve<IConsumer>(); Bryder ligeledes med konceptet og har intet med dependency injection at gøre.

Tag et kig på Structuremap eller Spring.Net :)
Avatar billede stephanryer Nybegynder
11. februar 2010 - 21:54 #2
Hejsa og tak for svaret.

Constructor injection er ikke rigtig en mulighed, når man snakker UserControls og Pages i asp.net. Hvis ikke du er til attribut-modellen, hvordan mener du så dependency injection skal implementeres i asp.net programmering? :)
Avatar billede janus_007 Nybegynder
11. februar 2010 - 22:25 #3
Hej Stephan

I eks.vis Spring.Net findes der en servicemodel til setter-injection så den kan anvende til når classen ikke har en default constructor som eks.vis .ascx, .aspx, .asmx mv.
StructureMap har også setter-injection, hvor man anvender en BuildUp et sted undervejs i sin wiring, typisk i global.asax.
Jeg kender ikke så meget til Ninject og Autofac, så om de fungerer på samme måde ved jeg ikke.

Ja nu har jeg jo næsten fortalt.. men DI skal enten foretages igennem constructoren eller setter (som sidste udvej), det er klart at yderste led må/ skal benytte setter injection (selvom man ofte ser en ServiceLocator/ Resolver til formålet), men de underliggende lag servicelag/ datalag mv skal wires up til constructor injection :)
Avatar billede stephanryer Nybegynder
11. februar 2010 - 23:44 #4
Men det du kalder setter injection, er det ikke det samme, som jeg beskriver med den property, jeg gengav i første post?

Kan du give et skitseret kodeeksempel på, hvordan tingene ser ud med det, du kalder setter injection? :)

På forhånd tak.
Avatar billede Syska Mester
12. februar 2010 - 01:49 #5
Class og Interface:
public interface ITest
    {
        string Name { get; set; }
    }

    public class Test : ITest
    {
        public string Name
        {
            get; set;
        }
    }

// Opsætning i ens registry
For<ITest>().Use(a => new Test() { Name = "Supermand"});

ObjectFactory.GetInstance<ITest>(); // Hent den

og hej Stephan ... vi ses i morgen.
Avatar billede stephanryer Nybegynder
12. februar 2010 - 09:15 #6
Buzzzzz: Tak for svaret.

Kan se dit forslag bygger på, at man ved asp.net programmering benytter en singleton-klasse til at håndtere instantiering af komponenter.

Janus+Buzzzz: Hvis man helt vil holde sig fra Singleton og ikke kan benytte constructor injection i sine controls, hvordan håndterer man så dependency injection i asp.net på den pæneste måde?
Avatar billede janus_007 Nybegynder
12. februar 2010 - 09:50 #7
For StructureMap vil det se sådan her ud:
ForRequestedType<Namespace.ISomeService.TheDefaultIsConcreteType<Namespace.SomeService>();

Nu virker den ved constructor calls, men hvis den også skal bruges til setter så:

SetAllProperties(s =>
{
s.OfType<Namespace.ISomeService>();
}

Evt. lave en base til din usercontrol ala:
public UserControlBase()
{
StructureMap.ObjectFactory.BuildUp(this);
}

Det er hvad der skal til i StructureMap, altså ingen attributter!

I Spring.Net skal du konfigurere i Xml (not my fav) :)


Jeg kan se at buzz også foreslår et ObjectFactory, det trækker spor efter DI rundt i applikationen = nogo :)
Avatar billede Syska Mester
12. februar 2010 - 16:02 #8
Nice way janus_007, så lærte jeg også noget ... :-)

Eneste ting er måske at du bruger ting som er udgået i nyeste version af StructureMap :-)
Avatar billede stephanryer Nybegynder
07. november 2010 - 13:40 #9
Gammelt spørgsmål - Skal lukkes. Alle de er interesseret kan lægge et svar indenfor en uge - så fordeles pointene som tak for interessen.
Avatar billede Syska Mester
08. november 2010 - 16:29 #10
Yo,

Ja, Singleton er meget normalt, men du kan også sende din Container med rundt ... og hente instances ud af den. Men om det løser problemet ved jeg ik'.

Mener at Ninjet ( http://ninject.org/ ) også har Attributes til det.

Men lige meget hvad man bruger, så får man jo en dependency på det man bruger.

Skal ik' have point her ...

mvh
Avatar billede stephanryer Nybegynder
09. november 2010 - 09:16 #11
"Men lige meget hvad man bruger, så får man jo en dependency på det man bruger."

Yes. Dog kan man begrænse sin dependency ved at tilgå en container via singleton. Så er det ét sted, denne skal udskiftes hvis det er. Tror det er den kænneste løsning, når man ikke kan injecte en container i constructoren til sine pages/user controls :)
Avatar billede Syska Mester
09. november 2010 - 09:24 #12
Yes.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester