首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让AsyncController与Ninject协同工作

让AsyncController与Ninject协同工作
EN

Stack Overflow用户
提问于 2010-08-31 01:10:57
回答 2查看 722关注 0票数 5

我正在尝试将控制器中的一些操作转换为在使用ninject进行依赖注入的mvc项目中异步运行。我正在通过继承AsyncController并将对应于“X”操作的方法更改为“XAsync”和“XCompleted”来遵循这些步骤,但是异步操作没有得到解决。我相信这个问题跟一个项目有关。我已经尝试显式地将ninject的Controller Action Invoker设置为'AsyncControllerActionInvoker':

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

但没那么走运。有没有人设法让异步操作与单对象一起工作?

干杯,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-01 00:08:29

本质上,我面临的问题是,ninjectControllerFactory使用的默认动作调用器不支持异步动作,当你试图在控制器中设置动作调用器时,默认的ninject会覆盖它。我采取了以下步骤来解决这个问题:

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

代码语言:javascript
复制
Bind<IActionInvoker>().To<AsyncControllerActionInvoker>().InSingletonScope();

2.我创建了一个自定义控制器工厂,它基本上是一个对象的控制器工厂,唯一的区别是它不会覆盖动作调用器。

代码语言:javascript
复制
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()方法中,我将控制器工厂设置为自定义工厂:

代码语言:javascript
复制
ControllerBuilder.Current.SetControllerFactory(new customNinjectControllerFactory(Kernel));`

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2010-09-16 06:08:02

经过多次搜索,我意识到除此之外,每个控制器都需要显式设置为使用支持异步操作的操作调用器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3602605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档