2008-11-14 19 views
15

No puedo encontrar la forma de definir el constructor predeterminado (cuando existe una sobrecarga) para un tipo en StructureMap (versión 2.5) por código.¿Cómo definir un constructor predeterminado por código usando StructureMap?

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 'programa previo':

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 

Cuando ejecuto mi aplicación, me dio este mensaje:

Código StructureMap Excepción: 202
Sin instancia predeterminada definida para PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

Si comulgo 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].

Respuesta

30

Puede especificar un constructor con ConstructedBy(). Por favor, intente esto:

ForRequestedType<MyDataContext>().TheDefault. 
Is.ConstructedBy(() => new MyDataContext()); 

Esto funcionó para mí.

+0

Muchas gracias, funcionó aquí también :-D! –

+23

SM 2.6 actualizada Sintaxis: para (). Use (() => new MyDataContext()); – mxmissile

+1

Aparece en SM 2.6.2 que el uso no tiene ningún argumento de constructor. –

0

No estoy seguro de cómo y si se puede hacer con la interfaz fluida/DSL interna. Sin embargo, puede utilizar un atributo, si no está preocupado por contaminando su dominio?

Etiquete su constructor preferido con [DefaultConstructor] StructureMap se establece por defecto en el constructor más codicioso por convención (constructor con la mayoría de los parámetros).

+0

Lo siento Cik, ya he escrito (pero no enviado) mi respuesta durante la actualización. –

+0

No hay problema, mi culpa ;-) Gracias por su respuesta de todos modos! El enfoque de anotar mi DataContext (en la creación de una clase parcial) sería posible, pero creo que se pierde de la ventaja de utilizar un IoC ... –

5

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 se puede inyectar aún más las definiciones de interfaces en el constructor MyDataContext como esto

SelectConstructor<MyDataContext>(() => new MyDataContext((IDatabaseFactory)null)); 

Sólo recuerde para definir el tipo de hormigón con StructureMap para la instancia IDatabaseFactory.

Cuestiones relacionadas