1

通过我的宠物项目,我正在尝试学习使用 Turbine 作为 DI 容器。

我正在将 unity 注册为 locatorprovider,如下所示:

static MvcApplication()
{
    ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());
}

我的用户存储库有一个无参数的构造函数,我正在注册它:

public class UserRepositoryRegistration : IServiceRegistration
{
    public void Register(IServiceLocator locator)
    {
        locator.Register<IUserRepository, UserRepository>();
    }
}

然后我有我的 HomeController 应该接受 IUserRepository

public class HomeController : Controller
{
    private readonly IUserRepository userRepository;

    public HomeController(IUserRepository repository)
    {
        userRepository = repository;
    }
}

如果我省略无参数 ctor(如上面的代码片段),我会得到这个(完整的这里):

“/”应用程序中的服务器错误。
 没有为此对象定义无参数构造函数。   
 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。  
 异常详细信息:System.MissingMethodException:没有为此对象定义无参数构造函数。  
 [InvalidOperationException:尝试创建类型为“Boris.BeekProject.Guis.Web.Controllers.HomeController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。]

所以我的 HomeController 有义务有一个 parless ctor。似乎不是 Unity 控制器工厂在实例化,而是默认控制器工厂。

更新
我的 MVCApplication 正在继承 TurbineApplication 并且由于 RouteRegistration 被拾取得很好,我认为问题出在其他地方。

更新
正如 Thomas Eyde 所建议的,我想覆盖该TurbineApplication.AutoComponent方法,但检查对象浏览器,我看不到任何对该方法的引用。此外,当我查看 NerdDinner 示例时,它似乎也没有覆盖此方法。在检查了有关它的在线文档后,我没有得到任何更明智的信息,并且按照有关手动注册的文档的链接为我提供了一个占位符页面。谁能告诉我我做错了什么?

我错过了什么吗?

4

2 回答 2

1

您必须覆盖TurbineApplication.AutoComponentSetup- 方法,如下所示:

protected override void AutoComponentSetup(IServiceLocator locator)
{
    //Remove this if you want to skip all other previous registrations
    base.AutoComponentSetup(locator);

    AutoRegistration<IMyCustomInterface>((loc, type) => loc.Register<IMyCustomInterface>(type));
}

另请参阅组件的自动注册

于 2009-12-08T19:02:00.340 回答
1

您的 Turbine 版本不支持 MVC2,其中 ControllerFactory 已更改为支持用于创建控制器的额外参数。这解释了为什么您的控制器永远不会被正确实例化。MVC2 的重大更改列出了此更改。

如果您想使用 MVC2 Beta(用于 .NET4)进行开发,我建议您获取 我刚刚发布的新 MVC2 (.NET4) 位。

希望对您有所帮助!

于 2009-12-17T15:09:04.900 回答