gpt4 book ai didi

asp.net-mvc - 让 AsyncController 与 Ninject 一起工作

转载 作者:行者123 更新时间:2023-12-03 02:10:17 27 4
gpt4 key购买 nike

我正在尝试将 Controller 中的某些操作转换为在使用 ninject 进行依赖项注入(inject)的 mvc 项目中异步运行。我按照以下步骤继承 AsyncController 并将与“X”操作对应的方法更改为“XAsync”和“XCompleted”,但异步操作未得到解决。我确信这个问题与 ninject 有关。我尝试将 ninject 的 Controller 操作调用程序显式设置为“AsyncControllerActionInvoker”:

Bind<IActionInvoker>().To<AsyncControllerActionInvoker>().InSingletonScope();

但没有运气。有没有人设法让异步操作与 ninject 一起工作?

干杯,

最佳答案

本质上,我面临的问题是 ninject 使用的默认操作调用程序不支持异步操作,当您尝试在 Controller 中设置操作调用程序时,默认的 ninjectControllerFactory 会覆盖它。我采取了以下步骤来解决该问题:

1.在注入(inject)映射中我添加了以下关联:

Bind<IActionInvoker>().To<AsyncControllerActionInvoker>().InSingletonScope();

2.我创建了一个自定义 Controller 工厂,它基本上是 ninject 的 Controller 工厂,唯一的区别是它不会覆盖操作调用程序。

public class CustomNinjectControllerFactory : DefaultControllerFactory {
/// <summary>
/// Gets the kernel that will be used to create controllers.
/// </summary>
public IKernel Kernel { get; private set; }

/// <summary>
/// Initializes a new instance of the <see cref="NinjectControllerFactory"/> class.
/// </summary>
/// <param name="kernel">The kernel that should be used to create controllers.</param>
public CustomNinjectControllerFactory(IKernel kernel) {
Kernel = kernel;
}

/// <summary>
/// Gets a controller instance of type controllerType.
/// </summary>
/// <param name="requestContext">The request context.</param>
/// <param name="controllerType">Type of controller to create.</param>
/// <returns>The controller instance.</returns>
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
if (controllerType == null) {
// let the base handle 404 errors with proper culture information
return base.GetControllerInstance(requestContext, controllerType);
}

var controller = Kernel.TryGet(controllerType) as IController;

if (controller == null)
return base.GetControllerInstance(requestContext, controllerType);

var standardController = controller as Controller;

if (standardController != null && standardController.ActionInvoker == null)
standardController.ActionInvoker = CreateActionInvoker();

return controller;
}

/// <summary>
/// Creates the action invoker.
/// </summary>
/// <returns>The action invoker.</returns>
protected virtual NinjectActionInvoker CreateActionInvoker() {
return new NinjectActionInvoker(Kernel);
}

}

3.在 OnApplicationStarted() 方法中,我将 Controller 工厂设置为我的自定义工厂:

ControllerBuilder.Current.SetControllerFactory(new customNinjectControllerFactory(Kernel));`

希望这有帮助。

关于asp.net-mvc - 让 AsyncController 与 Ninject 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com