En general, ¿la creación de instancias de clases con métodos, pero sin campos ni propiedades, tiene demasiados gastos generales?¿Qué tan rápido es la creación de instancias de clase con métodos, pero no campos ni propiedades?
Estoy desarrollando una aplicación ASP.NET MVC que usa mucho la inyección de constructor y algunos controladores tienen hasta 10 dependencias hasta ahora. Sin embargo, debido al alto número de dependencias, recurrí a una interfaz IMyAppServiceProvider
y clase que proporciona acceso genérico a todas las dependencias, a través de la DependencyResolver en MVC 3.
Arranqué todo mi código específico de la aplicación y creé un Gist con mi configuración básica (sin embargo, esto no incluye la configuración de BaseController mencionada a continuación).
También creé una clase BaseController que acepta el IMyAppServiceProvider
. Todos los controladores heredan de esta clase base. La clase base toma el objeto IMyAppServiceProvider
y tiene variables protegidas para todos los servicios. El código se ve más o menos así:
public class BaseController
{
protected IService1 _service1;
protected IService2 _service2;
protected IService3 _service3;
// ...
public BaseController(IMyAppServiceProvider serviceProvider)
{
_service1 = serviceProvider.GetService<IService1>;
_service2 = serviceProvider.GetService<IService2>;
_service3 = serviceProvider.GetService<IService3>;
// ...
}
}
Esto hace que el código para los controladores "muy limpio". Ninguna variable privada/protegida, ninguna asignación en el constructor y los servicios son referenciados por las variables protegidas de la clase base. Sin embargo, cada solicitud creará una instancia de cada uno de los servicios que utiliza mi aplicación, independientemente de si el controlador específico los usa o no.
Mis servicios son simples y solo contienen llamadas a métodos con alguna lógica comercial e interacción con la base de datos. Son apátridas y no tienen campos de clase o propiedades. Por lo tanto, la instanciación debe ser rápida, pero me pregunto si esta es una mejor práctica (sé que es un término cargado).
Como siempre, primero en el perfil. Sin embargo, voy a adivinar que la resolución de las dependencias es de un orden de magnitud más lenta que la creación de instancias. –
@insta Wow, no vi el bosque a través de los árboles. Pero, ¿se resuelven los problemas de la memoria caché de Ninject u otros contenedores de IoC? –
Agregué una respuesta a continuación que debería ayudarte ... Me he encontrado con este mismo problema exactamente antes. La mayoría de las personas (incluido yo mismo) no saben que se puede anular la fábrica de controladores que ASP.NET MVC utiliza para crear controladores. Una personalizada puede integrar su contenedor de IoC con fuerza y distribuir dependencias a medida que se necesiten. –