9

Ninject を WCF Web API Preview 5 で動作させるための正しい方向を誰か教えてもらえますか? ASP.NET MVC 3 プロジェクトと、Ninject.Extensions.Wcf ライブラリを使用する別の内部 WCF サービスで正常に稼働しています。ただし、新しい MVC 3 プロジェクトを作成し、NuGet から WebApi.All ライブラリを取得するときに、それを機能させることができません。

私はこのstackoverflowの投稿Setting up Ninject with the new WCF Web APIを見てきましたが、最新リリースのいくつかの変更に関係していると思われます。

また、メインのライブラリ以外にどの Ninject ライブラリを参照すればよいかもわかりません。Ninject.MVC3 、 Ninject.Extensions.Wcf を使用しますか?

これに関するヘルプは大歓迎です。

****アップデート**

私が使用しているコードは、上記の質問の回答からのものです。私はこれを独自のクラスファイルに持っています。

   public class NinjectResourceFactory : IResourceFactory
    {
        private readonly IKernel _kernel;

        public NinjectResourceFactory(IKernel kernel)
        {
            _kernel = kernel;
        }

        public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
        {
            return _kernel.Get(serviceType);
        }

        public void ReleaseInstance(InstanceContext instanceContext, object service)
        {
            // no op
        }
    }

これは私のglobal.asaxにあります:

var configuration = HttpConfiguration.Create().SetResourceFactory(new NinjectResourceFactory());
RouteTable.Routes.MapServiceRoute<myResource>("resource", configuration);

私が抱えている問題は、IResourceFactory インターフェイスが認識されず、HttpConfiguration.Create() が存在しないため、HttpConfiguration().CreateInstance メソッドを使用して試みた別の方法で SetResourceFactory を設定する必要があることです。喜び。

4

3 に答える 3

9

以下は、Ninject と WebApi を使用した私のコードです。動作します。WebApiConfiguration から継承するクラスを作成する

public class NinjectWebApiConfiguration : WebApiConfiguration {
    private IKernel kernel = new StandardKernel();

    public NinjectWebApiConfiguration() {
        AddBindings();
        CreateInstance = (serviceType, context, request) => kernel.Get(serviceType);
    }

    private void AddBindings() {
        kernel.Bind<IProductRepository>().To<MockProductRepository>();
    }

}

RegisterRoutes で NinjectWebApiConfiguration を使用します

public static void RegisterRoutes(RouteCollection routes) {

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

    var config = new NinjectWebApiConfiguration() { 
        EnableTestClient = true
    };

    routes.MapServiceRoute<ContactsApi>("api/contacts", config);
}
于 2011-10-11T09:21:10.607 に答える
4

P5 では、WebApiConfiguration から派生させ、派生した構成を使用する必要があります。

public class NinjectConfiguration : WebApiConfiguration
    {
        public NinjectConfiguration(IKernel kernel)
        {
            CreateInstance((t, i, m) =>
            {
                return kernel.Get(t);
            }); 
        }
    }
于 2011-09-30T12:55:02.783 に答える
3

ここに質問に対する素晴らしい回答がありますが、デフォルトの WebApi 構成での方法を示したいと思います。

    protected void Application_Start(object sender, EventArgs e) {

        RouteTable.Routes.SetDefaultHttpConfiguration(new Microsoft.ApplicationServer.Http.WebApiConfiguration() { 
            CreateInstance = (serviceType, context, request) => GetKernel().Get(serviceType)
        });

        RouteTable.Routes.MapServiceRoute<People.PeopleApi>("Api/People");
    }

    private IKernel GetKernel() { 

        IKernel kernel = new StandardKernel();

        kernel.Bind<People.Infrastructure.IPeopleRepository>().
            To<People.Models.PeopleRepository>();

        return kernel;
    }

以下のブログ投稿では、WCF Web API での Ninject 統合について少し説明しています。

http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet

于 2011-11-21T10:39:42.650 に答える