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)タイプRegisterRoutesのコンストラクターのパラメータールートへの依存性RouteCollectionの注入

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-applicationを参照してください。Ninject.Extensions.MVC必要なバインディングが追加されます。

于 2011-03-29T18:23:40.100 に答える
0

正確にNinjectについてはわかりませんが、他のコンテナでも同じ問題が発生しました。

コンテナはデフォルトでパラメータを使用してコンストラクタを取得し、自動配線を使用しようとしますが、の代わりに何を挿入するかがわかりませんRouteCollection

私は次のいずれかを試みます:

  • 必要なコンストラクターを使用するようにコンテナー登録を微調整します(たとえば、ラムダを使用すると、Ninjectは次のような登録を許可するはずですkernel.Bind<IBootstrapperTask>().To(() => new RegisterRoutes());
  • (おそらくより良い方法)何かをとして登録しRouteCollectionます。Idest- kernel.Bind<RouteCollection>().To(RouteTable.Routes)更新: Remoが言っているように、Ninject用のMVC拡張機能があり、そのような登録はすでに箱から出して提供されています(そしておそらくあなたが必要とする他のほとんどのもの)。だから、間違いなくこのように行きます。便宜上、これらの拡張機能を使用することをお勧めします。
于 2011-03-29T14:48:28.023 に答える