【问题标题】:Creating a bootstrapper in ASP.NET MVC 3 using Ninject and DependencyResolver使用 Ninject 和 DependencyResolver 在 ASP.NET MVC 3 中创建引导程序
【发布时间】:2011-03-29 14:29:51
【问题描述】:

我正在尝试创建一个简单的引导程序。我的 boostrapper 代码如下所示:

public static void Run()
{
    var tasks = DependencyResolver.Current.GetServices<IBootstrapperTask>();

    foreach (var task in tasks)
    {
        task.Execute();
    }
}

IBootstrapperTask 界面如下所示:

public interface IBootstrapperTask
{
    void Execute();
}

我的第一次尝试是通过引导程序注册路由:

public class RegisterRoutes : IBootstrapperTask
{
    private readonly RouteCollection routes;

    public RegisterRoutes(RouteCollection routes)
    {
        this.routes = routes;
    }

    public RegisterRoutes() : this(RouteTable.Routes)
    {
    }

    public void Execute()
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    }
}

我的 global.asax 看起来像:

protected void Application_Start()
{
    DependencyResolver.SetResolver(new NinjectDependencyResolver());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    Bootstrapper.Run();
}

我的 NinjectDependencyResolver 看起来像:

kernel.Bind<IBootstrapperTask>().To<RegisterRoutes>();

但是,当我尝试运行此代码时,出现以下异常:

激活 VirtualPathProvider 时出错 没有匹配的绑定可用,并且类型不是自绑定的。

激活路径:

3) RouteCollection类型的构造函数的参数virtualPathProvider中注入依赖VirtualPathProvider

2) 将依赖RouteCollection注入到RegisterRoutes类型的构造函数的参数路由中

1) 请求 IBootstrapperTask

任何帮助将不胜感激。

编辑

我的示例工作所需的缺失绑定是:

kernel.Bind<RouteCollection>().ToConstant(RouteTable.Routes);

如果您使用 Ninject MVC 扩展,则不需要此绑定,因为它已经具有此绑定以及其他一些开箱即用的绑定。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 ninject ninject-2


    【解决方案1】:

    请参阅https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application,了解如何正确使用Ninject.Extensions.MVC。它将添加必要的绑定。

    【讨论】:

    • Remo,你能解释一下为什么使用扩展可以解决我的问题吗?是不是因为已经为我建立了某些绑定(例如本例中的 VirtualPathProvider)?更重要的是,如果我选择不使用扩展,什么样的绑定可以解决我上面的问题?谢谢你的帮助。
    • 它添加了必要的绑定。很抱歉没有分析你必须添加什么来修复你自己的实现。我根本不需要时间来支持所有自定义实现。支持一种实现已经花费了很多时间。而且我认为定制一个没有意义。
    【解决方案2】:

    不确定究竟是 Ninject,但在其他容器中遇到了同样的问题。

    看起来容器默认采用带参数的构造函数,尝试使用自动装配但不知道要注入什么来代替RouteCollection

    我会尝试:

    • 调整容器注册以使用您需要的确切构造函数(例如,使用 lambda,我很确定 Ninject 应该允许像 kernel.Bind&lt;IBootstrapperTask&gt;().To(() =&gt; new RegisterRoutes());
    • 这样的注册
    • (可能是更好的方法)注册为RouteCollection。 id est - kernel.Bind&lt;RouteCollection&gt;().To(RouteTable.Routes)更新:正如 Remo 所说,有用于 Ninject 的 MVC 扩展,其中已经提供了开箱即用的注册(并且可能是您需要的大多数其他注册)。所以,一定要走这条路。为方便起见使用这些扩展是个好主意。

    【讨论】:

    • Ninject.Extensions.MVC 默认已经有 Bind().ToConstant(RouteTable.Routes) 。添加另一个将导致异常
    • 也许吧,但是主题中没有关于扩展的内容(我也不知道它们,我主要是 StructureMap 用户)。主题中提到的异常正是 IoC 容器尝试为给定的 BootstrapperTask 解析 RouteCollection 时的异常。它尝试创建 RouteCollection 类的实例,但未能为其构造函数找到 VirtualPathProvider(这意味着 RouteTable.Routes 未注册为默认 RouteCollection)。似乎主题启动器不使用这样的扩展。我会稍微更新一下我的答案,以便清楚地说明这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多