Enlace condicional de Ninject basado en el tipo de parámetro
Estoy usando una fábrica para devolver un datasender:
Bind<IDataSenderFactory>()
.ToFactory();
public interface IDataSenderFactory
{
IDataSender CreateDataSender(Connection connection);
}
Tengo dos implementaciones diferentes de datasender (WCF y remoting) que toman diferentes tipos:
public abstract class Connection
{
public string ServerName { get; set; }
}
public class WcfConnection : Connection
{
// specificProperties etc.
}
public class RemotingConnection : Connection
{
// specificProperties etc.
}
Estoy tratando de usar Ninject para vincular estos tipos específicos de datasender según el tipo de conexión que se pasa del parámetro. He intentado lo siguiente sin éxito:
Bind<IDataSender>()
.To<RemotingDataSender>()
.When(a => a.Parameters.Single(b => b.Name == "connection") as RemotingConnection != null)
Creo que esto se debe a que '.When' solo proporciona una solicitud y necesitaría el contexto completo para poder recuperar el valor del parámetro real y verificar su tipo. No sé qué hacer, aparte de usar enlaces con nombre, implementando realmente la fábrica y poniendo la lógica allí, es decir,
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));
}