我正在尝试如何为ASP.NET MVC3配置StructureMap我已经使用了NuGet,我注意到它创建了一个名为StructuremapMVC的cs文件的App_Start文件夹,所以我检查它并注意到它是一样的代码但已简化,将在Global.asax上的App_Start部分手动编写...
这是我来自IoC Class的代码
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.
答案 0 :(得分:4)
要处理控制器构造函数中的参数,必须配置依赖项解析器。
检查以下帖子,了解如何使用ASP.NET MVC3连接StructureMap:
http://stevesmithblog.com/blog/how-do-i-use-structuremap-with-asp-net-mvc-3/
答案 1 :(得分:3)
您收到该错误是因为您没有设置StructureMap来解析构造AsambleaController
所需的依赖关系,所以它试图找到一个没有参数的构造函数。
所以你需要做的是为IAsambleaRepository
和IUnitOfWork
设置StructureMap。
在旁注中,我会说IUnitOfWork
应该依赖于您的存储库而不是您的控制器......您的控制器不应该知道工作单元。
答案 2 :(得分:2)
如果您按照Repository上的帖子进行操作,则需要将这些配置添加到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");
答案 3 :(得分:2)
StructureMap.MVC3的NuGet安装在DependencyResolution文件夹中安装一个名为SmDependencyResolver.cs的文件。您会注意到其中的GetService方法有一个try ... catch,如果发生异常,它只返回null。这可以抑制异常的细节,以便您最终看到有关“无参数构造函数”的错误消息。
要获取有关原始异常的更多信息,可以在该catch子句中添加一些内容以吐出原始异常的详细信息 - 例如Debug.WriteLine:
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;
}
}
这可以帮助您找出问题的根源。
答案 4 :(得分:1)
在debug中运行,你可能会得到一个StructureMap IOC分辨率错误。
而不是获得真正的分辨率错误,而是显示此消息。在某些地方,MVC管道吞噬了真正的错误。