Tengo 2 implementaciones de la misma interfaz y quiero usar implementation1 si el usuario está conectado o implementado2 si el usuario no está conectado. ¿Cómo puedo configurar esto con castle windsor?Castle windor Agregar dependencia condicional
Respuesta
Una forma de resolver esto sería, registre el servicio con la clave y luego resuelva según lo necesite.
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;
}
}
El registro:
container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient);
container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient);
// resuelven cuando muestraa necesario.
var sampleA = container.Resolve<ISample>("SampleA");
// Resolve when SampleB needed.
var sampleB = container.Resolve<ISample>("SampleB");
Se podría añadir un handler selector, lo que sería capaz de seleccionar entre las implementaciones disponibles en función de, por ejemplo, si se configuró Thread.CurrentPrincipal
(o HttpContext.Current.Request.IsAuthenticated
en ASP.NET/MVC si no recuerdo mal).
El selector de controlador, probablemente se vería algo como esto:
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; }
}
// ....
}
El único inconveniente de los selectores de controlador es que no están sacados del envase - es decir, que están añaden como una instancia para el contenedor en el registro tiempo, para que no tengan que inyectarse dependencias, manejo de estilo de vida, etc., pero hay formas de mitigar eso; eche un vistazo al F.T.Windsor si le interesa ver cómo se puede hacer eso.
preguntándose si con la versión 3.0 todo cambió, quiero decir si aún se necesita una instalación externa. – Giedrius
- 1. Inyectar dependencia en CustomAttribute usando Castle Windsor
- 2. Dependencia condicional en Ruby Gemspec
- 3. Agregar propiedad de dependencia al control
- 4. Castle Windsor InternalsVisibleTo Silverlight
- 5. Castle windsor logging facility
- 6. Castle Windsor Transient Disposables
- 7. Cómo agregar un punto de interrupción condicional en Visual C++
- 8. agregar bloques de forma condicional en el diseño de magento
- 9. Xcode 4: Cómo agregar biblioteca estática Objetivo Dependencia al Proyecto
- 10. Forma simple de agregar URL jar como dependencia en sbt
- 11. Maven: agregar dependencia a la fuente del artefacto
- 12. Agregar proyecto como dependencia en XCode 4.x
- 13. Cómo inyectar UrlHelper en MVC usando Castle Windsor
- 14. Alternativas de inyección de constructor (Castle Windsor)
- 15. Castle DynamicProxy: obtener el objeto sin proxy
- 16. PBKDF2 en Bouncy Castle C#
- 17. Bouncy Castle PGP Decryption Issue
- 18. Registros internos para Castle Windsor
- 19. Asp.Net MVC vs Castle MonoRail
- 20. Windsor castle Propiedades de inyección del objeto construido
- 21. Condicional XAML (WPF)
- 22. Consultas de Linq condicional
- 23. ScalacOptions condicional con SBT
- 24. compilación condicional en OCaml
- 25. clave externa condicional PostgreSQL
- 26. SP_WHO2 condicional?
- 27. Sucursales condicional
- 28. Castle Windsor Fluent Registration - ¿Qué hace Pick()?
- 29. Windsor Castle: buenas fuentes de documentación, tutoriales
- 30. Castle Windsor: ¿Mi componente transitorio será basura?
donde llamarías 'container.Resolve()'? –
Windsor no sabrá que el usuario está conectado o no, a menos que modifique/amplíe su implementación interna. Puede haber una clase Decider entre las cuales tomará 'log in factor' en la cuenta y le dará la implementación deseada. –
Windsor * does * tiene mecanismos para esto (ver la respuesta de mookid), no es necesario alterar su implementación interna en absoluto. –