2011-09-21 5 views
7

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

1

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"); 
+1

donde llamarías 'container.Resolve()'? –

+0

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. –

+0

Windsor * does * tiene mecanismos para esto (ver la respuesta de mookid), no es necesario alterar su implementación interna en absoluto. –

7

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.

+1

preguntándose si con la versión 3.0 todo cambió, quiero decir si aún se necesita una instalación externa. – Giedrius

Cuestiones relacionadas