gpt4 book ai didi

asp.net-mvc - 如何使用 Ninject for DI 在 MVC 应用程序中使用 AsyncController?

转载 作者:行者123 更新时间:2023-12-02 00:16:24 25 4
gpt4 key购买 nike

有人知道如何在使用 Ninject 进行 DI 的 mvc 应用程序中使用 AsyncController 吗?

当我不使用 ninject 时,AsyncController 工作正常,但我无法让它们一起工作。

我在我的站点模块中添加了以下内容,但没有成功。

Bind<IAsyncController>( ).To<AsyncController>( ).InSingletonScope( );

抱歉没有详细解释这一点。

我的 Controller 看起来像这样

 [HandleError]
public class HomeController : AsyncController
{
public void IndexAsync( )
{
AsyncManager.OutstandingOperations.Increment( );

RssFeed feed = new RssFeed( );
feed.GetRssFeedAsyncCompleted += ( s, e ) =>
{
AsyncManager.Parameters[ "items" ] = e.Items;
AsyncManager.OutstandingOperations.Decrement( );
};
feed.GetRssFeedAsync( "http://feeds.abcnews.com/abcnews/topstories" );
}

public ActionResult IndexCompleted( IEnumerable<SyndicationItem> items )
{
ViewData[ "SyndicationItems" ] = items;
return View( );
}
}

我的 global.asax 看起来像这样

public class MvcApplication :  System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start( )
{
AreaRegistration.RegisterAllAreas( );
RegisterRoutes( RouteTable.Routes );
}
}

这工作正常。但是当我使用 ninject (ninject 2.0) 时,当我尝试访问索引页面时,我会收到 404 页面未找到错误。这就是我配置 ninject 的方式

public class MvcApplication : NinjectHttpApplication //System.Web.HttpApplication
{
#region IOC
static IKernel container;
public static IKernel Container
{
get
{
if ( container == null ) { container = new StandardKernel( new SiteModule( ) ); }
return container;
}
}

protected override IKernel CreateKernel( )
{
return Container;
}
#endregion

public static void RegisterRoutes( RouteCollection routes )
{
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}

//protected void Application_Start()
//{
// AreaRegistration.RegisterAllAreas();

// RegisterRoutes(RouteTable.Routes);
//}

protected override void OnApplicationStarted( )
{
AreaRegistration.RegisterAllAreas( );
RegisterRoutes( RouteTable.Routes );
}
}

public class SiteModule : NinjectModule
{
public override void Load( )
{

}
}

我需要在我的站点模块上绑定(bind)任何东西吗?

顺便说一句,我正在使用 Jeff Prosise 在他的博客中发布的示例 Here 您可以下载他的演示应用程序并尝试 Ninject-ify :)

感谢任何帮助。

最佳答案

它似乎不起作用,因为标准 NinjectControllerFactory 将 NinjectActionInvoker 插入到 Controller 的 ActionInvoker 属性中。 NinjectActionInvoker 派生自ControllerActionInvoker。然而,AsyncController 使用从 AsyncControllerActionInvoker 派生的 ActionInvoker。由于某种原因,这会导致 Controller 与路由不匹配,并返回 404。

真正的解决方案是对 Ninject 进行修补,以支持使用 AsyncControllerActionInvokers 构建 AsyncController。

但是,与此同时,这里有一个解决方法:

在您的 Global.asax 中,添加此覆盖:

    protected override Ninject.Web.Mvc.NinjectControllerFactory CreateControllerFactory()
{
return new MyNinjectControllerFactory( kernel );
}

然后为 MyNinjectControllerFactory 添加此类:

public class MyNinjectControllerFactory : Ninject.Web.Mvc.NinjectControllerFactory
{
public MyNinjectControllerFactory( IKernel kernel ) : base( kernel ) { }

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 = CreateActionInvoker();

return controller;
}
}

这是 NinjectControllerFactory 的副本,省略了 ActionInvoker 的分配。

如果您的代码依赖于注入(inject)到 ActionFilters 中的依赖项,则需要创建自己的 ActionInvoker,该 ActionInvoker 返回使用 Ninject 的 AsyncControllerActionInvoker。查看 NinjectActionInvoker 的 Ninject.Web.Mvc 源代码。

关于asp.net-mvc - 如何使用 Ninject for DI 在 MVC 应用程序中使用 AsyncController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823899/

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