通过我的宠物项目,我正在努力学习使用Turbine作为DI容器。
我将团结注册为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(就像上面的代码片段一样),我得到了这个(full here):
Server Error in '/' Application. No parameterless constructor defined for this object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. [InvalidOperationException: An error occurred when trying to create a controller of type 'Boris.BeekProject.Guis.Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
所以我的HomeController有义务拥有一个无助的ctor。 看来它不是Unity控制器工厂的实例化,而是默认的。
更新
我的MVCApplication继承了TurbineApplication,因为RouteRegistration很好,我认为问题出在其他地方。
更新
正如Thomas Eyde所建议的,我想覆盖TurbineApplication.AutoComponent
方法,但是检查对象浏览器,我看不到对此方法的任何引用。
此外,当我查看NerdDinner示例时,它似乎也没有覆盖此方法。
在检查online documentation about it之后,我没有得到更明智的信息,并且关于doing the registration manually的文档链接为我提供了一个占位符页面。
任何人都可以告诉我我做错了吗?
我错过了什么吗?
答案 0 :(得分: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));
}
答案 1 :(得分:1)
您的Turbine版本不支持MVC2,其中ControllerFactory被更改为支持创建控制器的额外参数。这就解释了为什么你的控制器永远不会被正确实例化。 The breaking changes of MVC2 list this change.
如果您想在开发中使用MVC2 Beta(用于.NET4),我建议您使用新的MVC2 (.NET4) bits I just released.
希望能帮到你!