5

我想要如何配置ASP.NET MVC3的StructureMap我已经使用NuGet,我注意到它创建了一个名为StructuremapMVC的cs文件的App_Start文件夹,所以我检查它并注意是相同的代码,但简化,将手动写上放置在Global.asax中App_Start节...首先尝试通过NuGet的StructureMap和MVC3

这是国际奥委会类我的代码

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; 
     } 
    } 

我的问题是,为什么我得到当我在我的控制器上注入一些IoC时(下面我使用这种模式: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(); 
     } 

异常表明:

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

回答

3

你得到这个错误,因为你没有设置StructureMap解决去构造所需的依赖AsambleaController所以它试图找到一个没有参数的构造函数。

所以你需要做的是设置StructureMap为IAsambleaRepositoryIUnitOfWork

在附注中,我会说IUnitOfWork应该是对您的存储库的依赖关系,而不是您的控制器......您的控制器不需要知道工作单元。

2

如果按照上库后,你会想这些配置增加您的IoC.cs文件:

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

调用:scan.TheCallingAssembly();只会看MVC项目。如果你有你的服务,并在仓库解决方案中的一个不同的项目,你将需要添加这样的:

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

在调试中运行,您可能会收到StructureMap IOC分辨率错误。

而不是获得真正的解决方案错误,而是显示此消息。 MVC管道的某处会吞噬真正的错误。

2

StructureMap.MVC3的NuGet安装会在文件夹DependencyResolution中安装一个名为SmDependencyResolver.cs的文件。您会注意到那里的GetService方法有一个try ... catch,如果发生异常,它将返回null。这可以抑制异常的细节,以便最终看到有关“无参数构造函数”的错误消息。

要获取有关原始异常的更多信息,可以在该catch子句中添加一些内容以便吐出原始异常的详细信息 - 例如Debug。WriteLine here:

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; 
     } 
    } 

这可以帮助您追踪问题的根源。

+0

+1:这对我有帮助。谢谢。 – 2012-07-31 14:20:53

+0

在我使用StructureMap的所有年份中,我从来没有注意到这一点,我想我会把这个尝试块取消。我认为我不希望StructureMap不会冒泡。 – 2012-07-31 15:35:33