7

Ninject と WebAPI.All を連携させるのに苦労しています。より具体的に説明します。
まず、WebApi.All パッケージをいじってみましたが、問題なく動作するようです。次に、次の行に次
のように追加しました。RegisterRoutesGlobal.asax

routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));

したがって、最終結果は次のとおりです。


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

    routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

}

すべて問題ないようですが、ユーザーを特定のアクションにリダイレクトしようとすると、次のようになります。

return RedirectToAction("Index", "Home");

ブラウザの URL はlocalhost:789/api/contacts?action=Index&controller=Home どちらが悪いですか。行を入れ替えたRegisterRouteところ、次のようになりました。


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 = UrlParameter.Optional } // Parameter defaults
            );
            routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
            ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

        }

これでリダイレクトは正常に機能しますが、API アクションにアクセスしようとすると、 Ninject couldn't return controller "api"絶対に論理的であるというエラーが表示され、そのようなコントローラーはありません。

Ninject を WebApi で動作させる方法についていくつかの情報を検索しましたが、見つかったものはすべて MVC4 または .Net 4.5 のみでした。技術的な問題により、プロジェクトを新しいプラットフォームに移行できないため、このバージョンの有効なソリューションを見つける必要があります。

この答えは実用的な解決策のように見えましたが、プロジェクトを起動しようとすると、コンパイラエラーが発生します

CreateInstance = (serviceType, context, request) => kernel.Get(serviceType);

教えてください:

System.Net.Http.HttpRequestMessage is defined in an assembly that is not referenced

アセンブリに参照を追加することについて何か

System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

次に何をすべきかわかりません.NET 4およびMVC3でwebapiを使用したninjectに関する有用な情報が見つかりませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

11

以下は、あなたが始めるためのいくつかのステップです。

  1. インターネット テンプレートを使用して新しい ASP.NET MVC 3 プロジェクトを作成する
  2. Microsoft.AspNet.WebApi次の 2 つの NuGetをインストールします。Ninject.MVC3
  3. インターフェイスを定義します。

    public interface IRepository
    {
        string GetData();
    }
    
  4. そして実装:

    public class InMemoryRepository : IRepository
    {
        public string GetData()
        {
            return "this is the data";
        }
    }
    
  5. API コントローラーを追加します。

    public class ValuesController : ApiController
    {
        private readonly IRepository _repo;
        public ValuesController(IRepository repo)
        {
            _repo = repo;
        }
    
        public string Get()
        {
            return _repo.GetData();
        }
    }
    
  6. に API ルートを登録しますApplication_Start

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        GlobalConfiguration.Configuration.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    
  7. Ninject を使用してカスタム Web API 依存関係リゾルバーを追加します。

    public class LocalNinjectDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver
    {
        private readonly IKernel _kernel;
    
        public LocalNinjectDependencyResolver(IKernel kernel)
        {
            _kernel = kernel;
        }
    
        public System.Web.Http.Dependencies.IDependencyScope BeginScope()
        {
            return this;
        }
    
        public object GetService(Type serviceType)
        {
            return _kernel.TryGet(serviceType);
        }
    
        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return _kernel.GetAll(serviceType);
            }
            catch (Exception)
            {
                return new List<object>();
            }
        }
    
        public void Dispose()
        {
        }
    }
    
  8. メソッド内にカスタムの依存関係リゾルバーを登録しますCreate( ~/App_Start/NinjectWebCommon.cs):

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
    
        RegisterServices(kernel);
    
        GlobalConfiguration.Configuration.DependencyResolver = new LocalNinjectDependencyResolver(kernel); 
        return kernel;
    }
    
  9. メソッド内でカーネルを構成しますRegisterServices( ~/App_Start/NinjectWebCommon.cs):

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IRepository>().To<InMemoryRepository>();
    }        
    
  10. アプリケーションを実行し、 に移動し/api/valuesます。

于 2012-10-21T09:50:07.093 に答える