0

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

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 扩展,则不需要此绑定,因为它已经具有此绑定以及其他一些开箱即用的绑定,如下面的答案所示。

4

2 回答 2

1

如何正确使用参见https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-applicationNinject.Extensions.MVC。它将添加必要的绑定。

于 2011-03-29T18:23:40.100 回答
0

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

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

我会尝试:

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