Tratando de averiguar cómo manejar mejor el siguiente escenario:La inyección de dependencia y la fábrica
suponga una clase RequestContext
que tiene una dependencia a un servicio externo, como por ejemplo:
public class RequestContext : IRequestContext
{
private readonly ServiceFactory<IWeatherService> _weatherService;
public RequestContext(ServiceFactory<IWeatherService> weatherService, UserLocation location, string query)
{
_weatherService = weatherService;
...
¿Qué tipo de dependencia ¿Debería requerir en la clase que finalmente instanciará RequestContext
? Podría ser ServiceFactory<IWeatherService>
, pero eso no parece correcto, o que podría crear un IRequestContextFactory
por ella a lo largo de las líneas de:
public class RequestContextFactory : IRequestContextFactory
{
private readonly ServiceFactory<IWeatherService> _weatherService;
public RequestContextFactory(ServiceFactory<IWeatherService> weatherService)
{
_weatherService = weatherService;
}
public RequestContext Create(UserLocation location, string query)
{
return new RequestContext(_weatherService, location, query);
}
}
y luego pasar el IRequestContextFactory
través de la inyección de constructor.
Esto parece una buena manera de hacerlo, pero el problema con este enfoque es que creo que dificulta la detectabilidad (los desarrolladores deben conocer la fábrica e implementarla, lo cual no es realmente evidente).
¿Existe alguna forma mejor/más reconocible de la que me pierdo?
Interesante, no he pensado en inyectar RequestContext directamente porque sus parámetros variarían en cada solicitud de página (ASP.NET MVC). ¿Sería una buena idea usar NInject para crear una instancia adecuada de la clase para mí, por ejemplo, mirando a la cadena de consulta? ¿O podría configurar NInject para usar una fábrica que devuelva una instancia, pero en el nivel básico solo inserte RequestContext? – andreialecu
Todavía no conozco Ninject lo suficiente como para responder a las especificaciones al respecto, pero si no lo admite directamente, siempre puede implementar esta pequeña parte usted mismo utilizando Abstract Factory inyectado en un consumidor de nivel superior. –