Pregunta

Sé que algunos marcos DI apoyan esta (por ejemplo, Ninject ), pero especialmente quiero saber si es posible con < a href = "http://code.google.com/p/autofac/" rel = "noreferrer"> Autofac .

Quiero ser capaz de pedir un contenedor Autofac para una clase concreta, y volver de una instancia con todas las dependencias del constructor adecuadas inyectados, sin tener que registrar esa clase concreta. Es decir, si nunca se unen explícitamente, a continuación, automáticamente se unen a la clase concreta a sí mismo, como si hubiera llamado builder.Register<MyClass>();

Un buen ejemplo de cuando esto sería útil es ViewModels. En MVVM, la estratificación es tal que sólo la vista depende del modelo de vista, y que a través de la tipificación suelto, y no lo hace la unidad de prueba de la vista de todos modos. Así que no hay necesidad de burlarse del modelo de vista para las pruebas - y por lo tanto no hay razón para tener una interfaz para cada modelo de vista. Así que en este caso, el patrón habitual de DI "registrar esta interfaz para resolver a esta clase" es una complejidad innecesaria. autovinculantes explícita, como builder.Register<MyClass>();, también se siente como un paso innecesario cuando se trata de algo tan sencillo como una clase concreta.

Soy consciente de la ejemplo de registro basado en la reflexión en el Autofac docs, pero eso no es de mi gusto bien. No quiero que la complejidad (y lentitud) de registrar todas las clases posibles antes de tiempo; Quiero el marco de dame lo que necesito cuando lo necesito. Convención sobre configuración, y todo eso.

¿Hay alguna manera de configurar Autofac por lo que puede decir "Oh, esto es un tipo de hormigón, y nadie se ha registrado todavía, así que voy a actuar como si hubiese sido registrada con la configuración predeterminada"?

¿Fue útil?

Solución

builder.RegisterTypesMatching(type => type.IsClass)

Si mira en la fuente verá que RegisterTypesMatching (y RegisterTypesFromAssembly) no está haciendo ninguna reflexión. Todo Autofac está haciendo en este caso está registrando una regla que acepta un tipo o no. En mi ejemplo de arriba Acepto cualquier tipo que sea una clase.

En el caso de RegisterTypesFromAssembly, Autofac registra una regla que dice que "si el tipo que está tratando de resolver tienen Asamblea == el conjunto especificado, entonces te daré un ejemplo".

Así que:

  1. ningún tipo de reflexión se realiza en tiempo de registro
  2. cualquier tipo que coincide con los criterios se resolverá

En comparación con registrar los tipos de hormigón directamente, esto tendrá un impacto en el tiempo de resolución Potencia desde Autofac tendrá que averiguar, por ejemplo, requisitos constructor. Dicho esto, si vas con alcance instancia predeterminada, que es único, que recibir el golpe sólo la primera vez a resolver ese tipo. La próxima vez que utilizará la instancia Singleton ya creado.

Actualización: en Autofac 2 hay una mejor manera de hacer que el contenedor capaz de resolver cualquier cosa. Esto implica la fuente de registro AnyConcreteTypeNotAlreadyRegistered .

Otros consejos

¿qué pasa con:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly());

ninguna reflexión se realiza, como Peter Lillevold señala .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top