【发布时间】:2016-01-05 06:45:42
【问题描述】:
我正在尝试指示我的 ASP.NET Core MVC 应用程序使用第 3 方 DI 容器。我没有编写适配器,而是尝试按照this post 中的建议插入库
这很好用——我可以用我自己的使用 DI 容器替换内置的IControllerActivator。但是,在尝试实例化也依赖于注入依赖项的自定义中间件时,我遇到了障碍。 ASP.NET 无法解决这些依赖关系,因为它没有使用我的第 3 方 DI 容器 - 中间件是否有 IControllerActivator 的等价物,还是我卡在使用内置 DI 或编写适配器?
** 编辑 **
这是我的更多代码 - 我实际上是在尝试使用上述模式使用 Ninject。
internal sealed class NinjectControllerActivator : IControllerActivator
{
private readonly IKernel _kernel;
public NinjectControllerActivator(IKernel kernel)
{
_kernel = kernel;
}
[DebuggerStepThrough]
public object Create(ActionContext context, Type controllerType)
{
return _kernel.Get(controllerType);
}
}
我发现我有两个问题:
- 我无法将标准 ASP.NET 组件注入到我的控制器中,因为 Ninject 不知道它们
- 我的使用应用程序服务的中间件无法实例化,因为 ASP.NET 不知道 Ninject。
以第一个问题为例,这是一个无法实例化的控制器,因为我使用的是IUrlHelper(另请注意ILogger,它也无法实例化):
public class SystemController : Controller
{
public SystemController(ILogger logger, IUrlHelper urlHelper)
{
/*...*/
}
}
这是自定义中间件的第二个问题的示例:
public class CustomMiddleware
{
private RequestDelegate _next;
// this is an application specific service registered via my Ninject kernel
private IPersonService _personService;
public CustomMiddleware(RequestDelegate next, IPersonService personService)
{
_next = next;
_personService = personService;
}
public async Task Invoke(HttpContext context)
{
/* ... */
}
}
我意识到理论上 ASP.NET 组件应该在它们自己的管道中,而我的应用程序组件应该在另一个管道中,但实际上我经常需要以横切方式使用组件(如上面的示例中所示)。
【问题讨论】:
-
你想使用什么 DI 容器?
-
@opants 看起来像 Simple Injector。
-
您能否分享有关您正在编写的中间件和您尝试注入的依赖项的更多信息。请您尝试过。
-
"或者我是卡在使用内置 DI 还是编写适配器"。您永远不需要构建适配器。根本不需要适配器,正如我在here 解释的那样,适配器只会妨碍您。
-
@opants:您不应该将其视为“2 个 DI 容器”。您的应用程序只有一个 DI 容器,并且您拥有“ASP.NET 的配置系统”,它在内部恰好看起来像一个 DI 容器。从某种意义上说,事情和以前没有什么不同。 MVC 和 Web API 已经有了自己的配置系统;我们从不想更换他们完整的内部配置系统。这真的没有意义。
标签: c# dependency-injection ninject asp.net-core