2013-03-07 9 views
8

ich eine Fabrik bin mit einem datasender zurückzukehren:Ninject bedingte Bindung basierend auf Parametertyp

Bind<IDataSenderFactory>() 
    .ToFactory(); 

public interface IDataSenderFactory 
{ 
    IDataSender CreateDataSender(Connection connection); 
} 

Ich habe zwei verschiedene Implementierungen von datasender (WCF und Remoting), die verschiedene Arten erfolgen:

public abstract class Connection 
{ 
    public string ServerName { get; set; } 
} 

public class WcfConnection : Connection 
{ 
    // specificProperties etc. 
} 

public class RemotingConnection : Connection 
{ 
    // specificProperties etc. 
} 

Ich versuche, Ninject zu verwenden, um diese bestimmten Typen von Datasender basierend auf dem Typ der Verbindung, die von dem Parameter übergeben wird, zu binden. Ich habe die erfolglos versucht folgende:

Bind<IDataSender>() 
    .To<RemotingDataSender>() 
    .When(a => a.Parameters.Single(b => b.Name == "connection") as RemotingConnection != null) 

Ich glaube, das liegt daran, dass ‚.Wenn‘ nur eine Anfrage stellt, und ich müsste die volle Kontext seiner Art in der Lage sein den aktuellen Parameterwert abzurufen und überprüfen. Ich bin ratlos, was zu tun, außer dem Namen Bindungen verwendet wird, tatsächlich die Fabrik Umsetzung und die Logik setzt dort

public IDataSender CreateDataSender(Connection connection) 
{ 
    if (connection.GetType() == typeof(WcfConnection)) 
    { 
     return resolutionRoot.Get<IDataSender>("wcfdatasender", new ConstructorArgument("connection", connection)); 
    } 

    return resolutionRoot.Get<IDataSender>("remotingdatasender", new ConstructorArgument("connection", connection)); 
} 

Antwort

6

Nach einigen dh Blick in Ninject Quelle habe ich gefunden, folgende:

  • a.Parameters.Single(b => b.Name == "connection") gibt Ihnen Variable des Typs IParameter, nicht real Parameter.

  • IParameter hat Methode object GetValue(IContext context, ITarget target), die nicht null Kontextparameter erfordert (Ziel kann null sein).

  • Ich habe keine Möglichkeit gefunden, IContext von Request (Variable a in Ihrer Probe) zu erhalten.

  • Context Klasse hat keinen parameterlosen Konstruktor, daher können wir keinen neuen Kontext erstellen.

, damit es funktioniert Sie Dummy IContext Implementierung wie erstellen: es

kernel.Bind<IDataSender>() 
     .To<RemotingDataSender>() 
     .When(a => a.Parameters 
        .Single(b => b.Name == "connection") 
        .GetValue(new DummyContext(), a.Target) 
       as RemotingConnection != null); 

public class DummyContext : IContext 
{ 
    public IKernel Kernel { get; private set; } 
    public IRequest Request { get; private set; } 
    public IBinding Binding { get; private set; } 
    public IPlan Plan { get; set; } 
    public ICollection<IParameter> Parameters { get; private set; } 
    public Type[] GenericArguments { get; private set; } 
    public bool HasInferredGenericArguments { get; private set; } 
    public IProvider GetProvider() { return null; } 
    public object GetScope() { return null; } 
    public object Resolve() { return null; } 
} 

und als verwenden Es wäre schön, wenn jemand ein paar Informationen über den Erhalt Context posten könnte von innen When() ...

Verwandte Themen