c# - sobrecarga - tipos de constructores
¿Cómo definir un constructor predeterminado por código usando StructureMap? (3)
No puedo entender cómo definir el constructor predeterminado (cuando existe una sobrecarga) para un tipo en StructureMap (versión 2.5) por código.
Quiero obtener una instancia de un servicio y el contenedor tiene que inyectar una instancia de contexto de datos Linq2Sql.
Escribí esto en mi método ''bootstrapper'':
ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
Cuando ejecuto mi aplicación, recibí este error:
Código de excepción de StructureMap: 202
No se definió ninguna instancia predeterminada para PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null
Si comento todos los contructors generados por Linq2Sql que no necesito, funciona bien.
Actualización: Ah, y olvidé decir que no usaría el atributo [StructureMap.DefaultConstructor]
.
No estoy seguro de cómo / si se puede hacer con la interfaz fluida / DSL interna. Sin embargo, ¿puede usar un atributo si no le preocupa que se contamine su dominio ?
Etiquete su constructor preferido con [DefaultConstructor] StructureMap tiene por defecto el constructor greediest por convención (constructor con la mayoría de los parámetros).
Puede especificar un constructor con ConstructedBy (). Por favor intente esto:
ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());
Esto funcionó para mí.
Supongo que también necesitaría establecer la duración del objeto (InstanceScope) si está utilizando Linq2Sql. Sugeriría usar este código porque le da un poco más de flexibilidad.
ForRequestedType< MyDataContext >()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType< MyDataContext >()
SelectConstructor< MyDataContext >( () => new MyDataContext());
Con este código también puede inyectar más definiciones de interfaces en el constructor MyDataContext como este
SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));
Solo recuerde definir el tipo concreto con StructureMap para su instancia de IDatabaseFactory.