Mi pregunta anterior sigue siendo válida, pero lo siguiente podría ayudar a usted de todos modos.
Funq no es compatible con la inyección automática del constructor (cableado automático a.k.a.), y tendrá que hacer esto a mano construyendo Func<T>
expresiones lambda. Como ya está haciendo la inyección de constructor a mano, es fácil elegir qué IDbConnectionFactory
desea inyectar en sus servicios. Ejemplo:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
Por supuesto, también se puede utilizar el nombre registros, así:
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
Debido a la falta de apoyo para auto-cableado, que va a terminar con estos registros bastante incómodo, y esto muy pronto resultará en una pesadilla de mantenimiento de su raíz de composición, pero eso no está relacionado con su pregunta ;-)
Por lo general, debe tratar de evitar la ambigüedad en su registro. En su caso, tiene una única interfaz, que hace dos cosas (se conecta a dos bases de datos).A menos que ambos comparten la misma base de datos de modelo exacto, cada base de datos se merece su propia interfaz (si las dos implementaciones no son intercambiables, se le violando la Liskov substitution principle):
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
Debido a las obras de manera ServiceStack, es probable que tenga para implementar una aplicación para cada uno:
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
Ahora se debe cambiar la definición de sus servicios a utilizar la interfaz específica en lugar de utilizar el IDbConnectionFactory
:
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
Tenga en cuenta que esta clase ahora usa inyección de constructor en lugar de inyección de propiedad. Puede hacer que esto funcione con la inyección de propiedad, pero generalmente es mejor usar la inyección de constructor. Aquí hay un SO question al respecto.
Con Funq, la configuración será el siguiente aspecto:
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
Esas dos nuevas interfaces y dos clases y el cambio a la MovieService
no se gana mucho, porque Funq no soporta auto alambrado. Usted será quien conecte todo junto manualmente. Sin embargo, cuando se cambia a un marco de trabajo que admite para el auto-cableado, este diseño permite al contenedor inyectar las dependencias correctas sin ningún problema, porque no hay discusión sobre qué inyectar.
¿Puede mostrar algún código? Creo que podemos darle algunos consejos sobre el diseño de su aplicación, pero para esto, necesitamos más información sobre el diseño real. Sería interesante ver en qué servicios se inyectan esas aplicaciones 'IDbConnectionFactory', y qué hacen esos servicios con esas dependencias' IDbConnectionFactory'. – Steven
Sin embargo, tenga en cuenta que Funq es un contenedor de IoC muy simplista (algunos incluso podrían argumentar que no es un contenedor de IoC), y todo debe estar cableado a mano. Sin embargo, puede inyectar todo lo que desee en cada servicio que cree. – Steven
Actualicé la pregunta, lo que es un poco más claro y encontré tu artículo sobre Simple Injector. Estoy dando una lectura ahora con la esperanza de profundizar mi comprensión de IoC. –