【问题标题】:ASP.NET Web API Dependency InjectionASP.NET Web API 依赖注入
【发布时间】:2017-10-22 17:29:15
【问题描述】:

我想知道是否可以在不使用 Unity 或 StructureMap 等第三方库且不使用实体框架的情况下在 ASP.NET Web API 中进行依赖注入(自定义构造函数)。

我想要实现的是有一个带有构造函数的控制器,例如:

public Controller(IDatabaseConnector connector) { ... }

我知道对于 MVC,您可以通过从 DefaultControllerFactory 继承然后覆盖 GetControllerInstance 函数来创建自定义 ControllerFactory。所以我确信 Web API 有替代方案。

【问题讨论】:

  • 阅读 IDependencyResolver 以获取 web api。确保它适用于 Web API,因为 MVC 有自己的同名。
  • 我最终从 IHttpControllerActivator 继承,这对我有用。
  • 当我尝试使用 asp 核心时,它的示例页面中有依赖注入 msdn.microsoft.com/en-us/magazine/mt703433.aspx
  • 依赖注入根本不需要 DI 容器。在Composition Root 中手动连接您的依赖项是一种称为Pure DI 的常见做法。正如您已经注意到的,您需要为此实现自定义 IHttpControllerActivator

标签: c# asp.net asp.net-web-api dependency-injection


【解决方案1】:

首先你应该定义你自己的IHttpControllerActivator:

public class CustomControllerActivator : IHttpControllerActivator
{
    public IHttpController Create(
        HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor,
        Type controllerType)
    {
        // Your logic to return an IHttpController
        // You can use a DI Container or you custom logic
    }
}

那么你应该替换Global.asax中的默认激活器:

protected void Application_Start()
{
    // ...

    GlobalConfiguration.Configuration.Services.Replace(
        typeof(IHttpControllerActivator),
        new CustomControllerActivator());
}

现在你可以使用你丰富的Controller 构造函数了:

public class UserController
{
    public UserController(
        IMapper mapper,
        ILogger logger,
        IUsersRepository usersRepository)
    {
        // ...
    }

    // ...
}

【讨论】:

  • 我已经这样做了,正如您在我的帖子的评论中看到的那样,但仍然感谢您的帮助! +1
猜你喜欢
  • 2018-03-24
  • 2015-11-08
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多