【问题标题】:Unable to perform dependency injection in MVC 5 Web API project using Castle Windsor无法使用 Castle Windsor 在 MVC 5 Web API 项目中执行依赖注入
【发布时间】: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


【解决方案1】:

请务必阅读 Mark Seemann 撰写的所有关于 WEB API 的文章。 您可以启动here,然后遍历Web API here 的存档。

阅读第一篇文章,然后遍历存档。一切都在这里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多