Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

IoC e container

15 views
Skip to first unread message

Stefano Paparesta

unread,
Jan 23, 2013, 3:55:39 AM1/23/13
to
Sto usando Castle Windsor, in accoppiata con CommonServiceLocator. Lo sto usando un po' pedestremente, senza farmi troppe domande, ma la curiosità è troppa... ;-)
Diciamo che una volta configurato il container, tutte le volte che devo tirare fuori una classe\servizio devo avere sotto mano una istanza del container.
In questo mi viene in aiuto CommonServiceLocator che oltre tutto mi nasconde il tipo di framework IoC usato, ma se volessi fare senza, cosa dovrei creare una classe con un metodo statico che mi restituisce il container o c'è qualche metodo più elegante ?
Grazie

Stefano

Mauro Servienti [MVP]

unread,
Jan 23, 2013, 1:17:13 PM1/23/13
to
Ciao Stefano Paparesta,
detto in maniera molto brutale il ServiceLocator è uno smell, non
dovresti in nessun modo sapere, dall'interno dell'app che c'è qualcuno
che risolve servizi/componenti per te.
Ovvio che ci saranno dei casi in cui ti servirà, ergo ti fai una
factory/builder custom.

> Stefano

.m

--
blog @ //milestone.topics.it


Stefano Paparesta

unread,
Jan 23, 2013, 2:24:04 PM1/23/13
to

> factory/builder custom.

Dentro Radical trovo un esempio ? Se mi dai una dritta io studio..

Grazie Mauro

Stefano

Mauro Servienti [MVP]

unread,
Jan 24, 2013, 12:49:38 AM1/24/13
to
Ciao Stefano,

You wrote on 23/01/2013 :
>
>> factory/builder custom.
>
> Dentro Radical trovo un esempio ? Se mi dai una dritta io studio..

si e no, nel senso che Radical.Presentation.Sammples è basato su
Windsor, ma non è visibile da nessuna parte se non nel bootstrapper.

Una volta che il container è configurato, e che hai usato il container
per risolvere il 1° componente da cui partire, in'unapplicazione
desktop ad esempio la "main window", tutto il resto deve fluire
semplicemente dichiarando le dipendenze, quindi (pensando a Radical) se
la main window ha bisogno del broker farà così:

class MainViewModel
{
public MainViewModel( IMessageBorker broker ){ }
}

dichiarando la dipendenza sul costruttore e non usando il locator:

class MainViewModel
{
public MainViewModel()
{
var broker = ServiceLocator.GetService<IMessageBroker>();
}
}

che complica in primis la fase di testing, nel caso in cui hai bisogno
invece di di controllare _quando_ un componente viene risolto, ci sono
tanti buoni motivi per farlo ma devono essere casi "rari", ti devi
mettere in mezzo tu con una factory:

class BrokerFactory
{
public BrokerFactory( IWindsorContainer container ){}

public IMessageBroker GetBroker()
{
return this.container.Resolve<IMessageBroker>();
}
}

> Grazie Mauro

Stefano Paparesta

unread,
Jan 24, 2013, 2:46:52 AM1/24/13
to
Grazie.
0 new messages