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 logging facility
- 5. Castle Windsor InternalsVisibleTo Silverlight
- 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. Cómo inyectar UrlHelper en MVC usando Castle Windsor
- 10. Xcode 4: Cómo agregar biblioteca estática Objetivo Dependencia al Proyecto
- 11. Maven: agregar dependencia a la fuente del artefacto
- 12. Forma simple de agregar URL jar como dependencia en sbt
- 13. Agregar proyecto como dependencia en XCode 4.x
- 14. Alternativas de inyección de constructor (Castle Windsor)
- 15. Castle DynamicProxy: obtener el objeto sin proxy
- 16. Asp.Net MVC vs Castle MonoRail
- 17. Registros internos para Castle Windsor
- 18. Bouncy Castle PGP Decryption Issue
- 19. PBKDF2 en Bouncy Castle C#
- 20. Windsor castle Propiedades de inyección del objeto construido
- 21. Condicional XAML (WPF)
- 22. Consultas de Linq condicional
- 23. compilación condicional en OCaml
- 24. ScalacOptions condicional con SBT
- 25. clave externa condicional PostgreSQL
- 26. SP_WHO2 condicional?
- 27. Sucursales condicional
- 28. Comparando Castle Windsor, Unity y StructureMap
- 29. Castle, AOP y Logging in .NET
- 30. ¿Qué es Castle proxy factory en NHibernate?
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. –