.net - injection - unity ioc
¿Existe un IoC de.NET que prefiera la convención sobre la configuración? (6)
Creo que encontrarás esta característica en la mayoría de los contenedores que hay. Eche un vistazo a esta publicación de blog . Está ligeramente envejecido, pero te dará una idea. En este momento, los contenedores activos probablemente tengan mejor soporte.
En pocas palabras, si tuviera que usar un contenedor IoC / DI, es fácil de implementar (no es un gran admirador de usar el archivo config / xml para todo), una buena documentación estable y compatible con .net, ¿cuál sería?
Podría ser solo yo, pero demasiados archivos xml como uno para la aplicación, algunos para ORM, algunos para otro componente, a veces se vuelve abrumador. Además, de la manera en que lo veo, si hay una forma de hacer las cosas (convenciones), es menor la posibilidad de estropear las cosas.
Esperamos sus sugerencias y, si es posible, las experiencias. Mi principal preocupación es el mantenimiento y la facilidad de implementación.
Yo uso Ninject y StructureMap , ambos te permiten conectar tu configuración sin XML.
No es para promocionar desvergonzadamente mi sitio, pero escribí un tutorial sobre el uso de Ninject disponible aquí .
¿Quizás puedas usar DI sin un contenedor?
Aquí hay un ejemplo que usa inyección de constructor:
public static void Main() {
ILogger logger = new FileLogger();
ISession session = new ConcreteSession();
IRepository repository = new MyDataRepositoryImpl(session, logger);
IApplication app = new MyApplication();
app.AddModule(new DataSelector(repository));
app.AddModule(new Editor(repository, new MyEditorFactory(session)));
app.AddModule(new LdapAuthenticator(session, logger));
// ...
app.Run();
}
Si lo haces de esta manera, tu módulo ejecutable tendrá dependencias para todo, por lo que debes limitar su responsabilidad a simplemente conectar cosas. Puede mantener la mayor parte del código de su aplicación limpia en otros módulos.
A menudo no necesita marcos avanzados para administrar sus dependencias con inyección.
Prueba LinFu . Es uno de los contenedores más fáciles y flexibles que existen y requiere la menor cantidad de código, y es el único contenedor en la comparación de contenedores de IOC que pasa TODAS las pruebas. Disfruta :)
Castle Windsor lo permite a través de las llamadas de registro. Un escenario simple es, digamos que tiene muchos Controladores que implementan una interfaz IController :
container.Register(AllTypes.FromAssembly(assemblyA).BasedOn(typeof(IController));
Puede simplificar esto aún más creando una interfaz IService (sin miembros) y agregándola a la anterior. De esta manera, cuando creas un servicio, se registra automáticamente.
La última versión de StructureMap , 2.5.2, no solo le permite configurar su contenedor sin XML como dijo Ryan, sino que también tiene la capacidad de AutoWire cosas de acuerdo con una convención, que parece ser exactamente lo que está buscando.
ObjectFactory.Initialize(x => x.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.WithDefaultConventions();
}));;
De los documentos en IAssemblyScanner.WithDefaultConvents ():
Agrega DefaultConventionScanner a la operación de escaneo. es decir, una clase concreta llamada "Something" que implementa "ISomething" se agregará automáticamente al PluginType "ISomething"
Personalmente, no he hecho mucho con él ya que ya tenía la configuración existente que usaba la Interfaz Fluent. Pero parece prometedor.
EDITAR: Jeremy Miller acaba de publicar una publicación sobre cómo crear sus propias convenciones ...