【发布时间】:2013-03-19 11:17:20
【问题描述】:
我的 ASP .NET MVC 应用程序中有一个奇怪的问题。我有一些控制器和一些IHelper,它是这个控制器的实现Helper。当我像下面这样使用这个助手时:
public ActionResult SomeAction()
{
var hepler = new Helper();
helper.DoStuff();
...
}
一切正常。但是当我尝试将此帮助器作为控制器的属性注入时:
public IHelper Helper { private get; set; }
...
public ActionResult SomeAction()
{
Helper.DoStuff();
...
}
在我的 IoC 配置类中,我有:
ObjectFactory.Initialize(x =>
{
// Helpers
x.For<IHelper>().Use<Helper>();
...
x.FillAllPropertiesOfType<IHelper>().Use<Helper>();
...
}
问题是我在 IoC 配置类中使用 IoC 模式初始化了许多不同的助手、管理器、存储库和其他东西,并成功注入到我的每个控制器中。但是当我尝试注入这个 Helper 我得到:
InvalidOperationException: An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor.
我知道问题出在 IoC 和这个 Helper 中,因为我搜索了 this,从 IoC 配置类中删除了 Helper,像 var hepler = new Helper(); 一样使用它,一切正常。但我不明白问题出在哪里?以前有人见过这样的问题吗?我什至无法理解 确保控制器具有无参数的公共构造函数和 控制器属性之一的 IoC 初始化如何关联,当一切都对另一个助手很好时,等等
编辑
附言我正在使用 StructureMap IoC 框架和 ASP .NET MVC 4.0。
【问题讨论】:
-
提及您正在使用 StructureMap 可能会有所帮助。
-
不确定您使用的是哪个 IoC 系统,但您是否尝试过使用
setpublic而不是private? -
我刚刚也注意到了……而且是
get是私有的,而不是set。那还能用吗?由于该属性甚至没有被使用,因此尚不清楚它的意图。 -
@Damien_The_Unbeliever,设置为公开。 Get 是私有的,以使该属性在当前控制器中以只读方式访问。 Set 具有与属性本身相同的访问级别 - public,以使其可用于测试(模拟)和 IoC 框架。
-
一个属性,其 setter 比它的 getter 具有更高的可见性,这听起来像是一种反模式。改用构造函数参数注入。
标签: c# asp.net-mvc asp.net-mvc-4