Я пытаюсь поручить моему приложению ASP.NET Core MVC использовать сторонний контейнер DI. Вместо написания адаптера я пытаюсь просто подключить библиотеку в соответствии с рекомендациями в this postЗамените активатор для промежуточного программного обеспечения в ASP.NET Core
Это работает очень хорошо - я могу заменить встроенный IControllerActivator
своим собственным, который использует контейнер DI. Тем не менее, я сталкиваюсь с препятствием при попытке создания пользовательского промежуточного программного обеспечения, которое также зависит от вложенных зависимостей. ASP.NET не может разрешить эти зависимости, поскольку он не использует мой сторонний контейнер DI - есть ли эквивалент IControllerActivator
для промежуточного программного обеспечения, или я застрял, используя встроенный DI или записывая адаптер?
** EDIT **
Вот еще некоторые из моего кода - Я на самом деле пытается использовать 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 должны быть в их собственном трубопроводе и мои компоненты приложения должны быть в ANO но на практике мне часто приходится использовать компоненты поперечным способом (как в приведенных выше примерах).
Какой контейнер DI вы пытаетесь использовать? – Dealdiane
@opiants выглядит как простой инжектор. –
Можете ли вы поделиться дополнительной информацией о промежуточном программном обеспечении, которое вы пишете, и о зависимостях, которые вы пытаетесь ввести. Пожалуйста, что вы пытались. – Steven