【发布时间】:2014-10-28 11:32:04
【问题描述】:
下面是我想使用 Windsor Castle 实例化的控制器的代码。
public class TestController : ApiController
{
private ITestService _testService = null;
public TestController(ITestService testService)
{
_testService = testService;
}
public IList<TestClass> Get()
{
IList<TestClass> testObjects = _testService.GetAll().ToList();
return testObjects;
}
}
我在 Global.asax.cs 中编写了以下代码
protected void Application_Start()
{
........................
InitializeServiceLocator();
}
private static void InitializeServiceLocator()
{
_container = new WindsorContainer().Install(FromAssembly.This());
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
这是安装程序的代码 =>
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
if (store == null)
{
throw new ArgumentNullException("store");
}
//All MVC controllers
container.Register(Classes.FromThisAssembly().BasedOn<IHttpController>().LifestylePerWebRequest());
AddComponentsTo(container);
}
private void AddComponentsTo(IWindsorContainer container)
{
container.Register(
///DBContext
Component.For<DbContext>().ImplementedBy<SCFEntities>().LifestyleTransient());
container.Register(
Classes.FromAssemblyNamed("MyProject.ApplicationServices").Pick().WithService.DefaultInterfaces().LifestylePerWebRequest(),
Classes.FromAssemblyNamed("MyProject.Data").Pick().WithService.DefaultInterfaces().LifestylePerWebRequest());
}
}
问题是控制器实例不是使用参数化构造函数创建的。它期待一个无参数的构造函数。有人能指出我哪里出错了吗?谢谢。
【问题讨论】:
-
问题是你为MVC注册了一个控制器工厂,但是Web API有不同的拦截点。您需要注册 Web API DependencyResolver。
-
你是对的@Steven。感谢您的帮助。
标签: asp.net-mvc asp.net-web-api dependency-injection castle-windsor ioc-container