5

Estoy tratando de entender cómo configurar StructureMap para ASP.NET MVC3 Ya he usado NuGet y he notado que crea una carpeta App_Start con un archivo cs llamado StructuremapMVC, entonces verifico y aviso de que es el mismo código, pero simplificado que serán escritos manualmente en la sección App_Start colocado en Global.asax ...Primero intente StructureMap y MVC3 a través de NuGet

Este es mi código de la COI Clase

public static class IoC 
    { 
     public static IContainer Initialize() 
     { 
      ObjectFactory.Initialize(x => 
         { 
          x.Scan(scan => 
            { 
             scan.TheCallingAssembly(); 
             scan.WithDefaultConventions(); 
             scan.AddAllTypesOf<IController>(); 
            }); 
          x.For<OpcionDB>().Use(() => new DatabaseFactory().Get()); 
         }); 
      return ObjectFactory.Container; 
     } 
    } 

mi pregunta es ¿por qué me sale una Excepción cuando inyecte IoC en mis Controladores como sigue (uso este patrón: Entity Framework 4 CTP 4/CTP 5 Generic Repository Pattern and Unit Testable):

 private readonly IAsambleaRepository _aRep; 
     private readonly IUnitOfWork _uOw; 

     public AsambleaController(IAsambleaRepository aRep, IUnitOfWork uOw) 
     { 
      _aRep = aRep; 
      this._uOw = uOw; 
     } 

     public ActionResult List(string period) 
     { 
      var rs = _aRep.ByPeriodo(period).ToList<Asamblea>(); 

      return View(); 
     } 

Excepción mostró:

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 

Respuesta

3

Usted está recibiendo este error porque no ha configurado StructureMap para resolver las dependencias necesarias para el contruct AsambleaController, por lo que intenta encontrar un constructor sin parámetros que no existe.

Entonces, lo que necesita hacer es instalar StructureMap para IAsambleaRepository y IUnitOfWork.

En una nota lateral, yo diría que IUnitOfWork debe ser una dependencia de su repositorio y no su controlador ... su controlador no debería necesitar saber acerca de la unidad de trabajo.

2

Si ha seguido el mensaje el Repositorio que tendrá que añadir a estas configuraciones su IoC.cs del archivo:

x.For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>(); 
x.For<IDatabaseFacroey>().HttpContextScoped().Use<DatabaseFactory>(); 
x.For<IAsambleaRepository >().HttpContextScoped().Use<AsambleaRepository>(); 

La llamada a: scan.TheCallingAssembly(); solo mirará el proyecto MVC. Si usted tiene sus servicios y repositorios en un proyecto diferente en su solución tendrá que añadirlo como esto:

scan.Assembly("Your.Assembly"); 
1

Ejecutar en la depuración, es probable que obtenga un error de resolución IOC de StructureMap.

En lugar de obtener el error de resolución real, aparece este mensaje en su lugar. En algún lugar a lo largo de las líneas, la tubería de MVC se traga el error real.

2

La instalación NuGet de StructureMap.MVC3 instala un archivo llamado SmDependencyResolver.cs en la carpeta DependencyResolution. Notará que el método GetService tiene una oportunidad ... catch that simplemente devuelve null si ocurre una excepción. Esto puede suprimir los detalles de una excepción para que termine viendo el mensaje de error sobre "no constructor sin parámetros" en su lugar.

Para obtener más información acerca de la excepción original, puede agregar algo en esa cláusula de captura para escupir los detalles de la excepción original, por ejemplo, la depuración.WriteLine aquí:

public object GetService(Type serviceType) 
    { 
     if (serviceType == null) return null; 
     try 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
        ? _container.TryGetInstance(serviceType) 
        : _container.GetInstance(serviceType); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.ToString()); 
      return null; 
     } 
    } 

Esto puede ayudarlo a localizar el origen del problema.

+0

+1: Esto me ayudó. Gracias. –

+0

En todos mis años de uso de StructureMap nunca lo noté, creo que voy a romper este bloque de intentos. No creo que quiera que StructureMap no brote. –

Cuestiones relacionadas