Ho 2 implementazioni della stessa interfaccia e voglio usare implementation1 se l'utente è loggato o implementation2 se l'utente non è loggato. Come posso configurarlo con il windsor del castello?Castle windor Aggiunta dipendenza condizionale
risposta
Un modo per risolvere questo sarebbe, registrare il servizio con la chiave e quindi risolvere come necessario.
public interface ISample
{
int Calculate(int a, int b);
}
class SampleB : ISample
{
public int Calculate(int a, int b)
{
return a + b + 10;
}
}
class SampleA : ISample
{
public int Calculate(int a, int b)
{
return a + b;
}
}
La registrazione:
container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient);
container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient);
// si risolvono quando SampleA necessario.
var sampleA = container.Resolve<ISample>("SampleA");
// Risolve quando è necessario SampleB.
var sampleB = container.Resolve<ISample>("SampleB");
Si potrebbe aggiungere un handler selector, che sarebbe in grado di selezionare tra le implementazioni disponibili a seconda ad esempio se è stato impostato Thread.CurrentPrincipal
(o HttpContext.Current.Request.IsAuthenticated
in ASP.NET/MVC se ricordo correttamente).
Il selettore gestore sarebbe probabilmente guardare un po 'come questo:
public class MyAuthHandlerSelector : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
return service == typeof(ITheServiceICareAbout);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return IsAuthenticated
? FindHandlerForAuthenticatedUser(handlers)
: FindGuestHandler(handlers);
}
bool IsAuthenticated
{
get { return Thread.CurrentPrincipal != null; }
}
// ....
}
L'unico lato negativo di selettori gestore è che non stanno tirato dal contenitore - vale a dire che stanno aggiunti come un'istanza al contenitore al momento della registrazione tempo, in modo che non possano avere le dipendenze iniettate, lo stile di vita gestito, ecc., ma ci sono modi per attenuarlo - dai uno sguardo allo F.T.Windsor se sei interessato a vedere come si può fare.
chiedendo se con la versione 3.0 qualsiasi cosa è cambiata - voglio dire se è ancora necessaria la funzione esterna. – Giedrius
- 1. Dipendenza condizionale in Ruby Gemspec
- 2. aggiunta visibilità condizionale al controllo WPF ToolTip
- 3. Java - Aggiunta della dipendenza jar in pom.xml
- 4. Aggiunta di più condizioni in Pannello condizionale in Shiny
- 5. d3 aggiunta attributo di dati in modo condizionale
- 6. Aggiunta alla scala mappa all'interno per ciclo e istruzione condizionale
- 7. La dipendenza di gradle compile non viene aggiunta al classpath
- 8. Xcode: Aggiunta di un progetto come una dipendenza di compilazione
- 9. Castle Windsor Dependency Resolver per MVC 3
- 10. Come iniettare UrlHelper in MVC usando Castle Windsor
- 11. Castle Windsor - implementazione multipla di un'interfaccia
- 12. Setup Castle Windsor in MVC
- 13. Log interni per Castle Windsor
- 14. Utilizzo Bouncy Castle TLS API
- 15. Bouncy Castle: PEMReader => PEMParser
- 16. Bouncy Castle PGP Decryption Issue
- 17. Utilizzare correttamente dipendenza dipendenza
- 18. angularjs 1.5 dipendenza dipendenza componente
- 19. dipendenza runtime vs build dipendenza
- 20. Unità di dipendenza dipendenza iniezione
- 21. XAML condizionale (WPF)
- 22. Crittografia Java Castle Bouncy - Cifratura con AES
- 23. Castle Windsor Resolve in fase di esecuzione
- 24. Equivalenti di Castle Windsor Typed Factory Facility
- 25. Castle Windsor - Rilasciare l'interceptor con Transient Lifestyle
- 26. Servizio di carico lento Castle Windsor
- 27. Utilizzo di Entity Framework con Castle Windsor
- 28. Async MVC Action con Castle Windsor
- 29. Castle DynamicProxy: Ottieni oggetto senza proxy
- 30. Caricamento lento con NHibernate Castle Facility
dove chiamereste 'container.Resolve()'? –
Non è possibile che windsor sappia che l'utente è connesso o meno a meno che non si modifichi/estenda la sua implementazione interna. Tra i due può esserci una classe Decider che tiene conto del "log in factor" e fornisce l'implementazione desiderata. –
Windsor * ha * meccanismi per questo (vedi la risposta di mookid), non è necessario modificare la sua implementazione interna. –