2012-03-28 11 views
1

私はASP.NETのWeb APIにWCFのWeb APIからプロジェクトを変換しています - 感謝MS :(ASP.NETのWeb API(セルフホスト)+ Ninject - デフォルトのバインディング

セルフホスティングPOCコード:

static void Main(string[] args) 
    { 
     var kernel = new StandardKernel(); 

     const string baseAddress = "http://localhost:8080"; 
     var config = new HttpSelfHostConfiguration(baseAddress); 
     config.ServiceResolver.SetResolver(new NinjectServiceLocator(kernel)); 

     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}); 

     var server = new HttpSelfHostServer(config); 
     server.OpenAsync().Wait(); 
     Console.WriteLine("The server is running...."); 
     Console.ReadLine(); 
    } 

私は、依存リゾルバとしてNinjectを登録していますこれを達成するために、私はそれを登録するCommonServiceLocator.NinjectAdapterを使用しています:。

config.ServiceResolver.SetResolver(new NinjectServiceLocator(kernel)); 

これは、限り、それは少し感じているが、私が言うことができるように動作するようですSetResolver(オブジェクト)を使って汚い

私が今問題としているのは、それを実行しようとすると、もはや登録されていないバインディングがたくさんあるからです(すなわち、IHttpContollerFactory、​​など)。

私は1つずつ進み、すべての "デフォルト"依存関係を再登録する必要がありますか?既定の依存関係リゾルバに既定値が登録されているのは奇妙に思えますが、新しい依存関係リゾルバが設定されている場合、既定値をすぐに再登録する方法はわかりません。​​のようなものについては、デフォルトのSystem.Web.Http.Common.Logging.DiagnosticLoggerにアクセスしてバインディングを作成することさえできないようです。

何か不足していますか?

答えて

2

デフォルトのサービスを再登録する必要はありません。 nullを返すと、フレームワークはデフォルトの内部DIコンテナに戻ります。また、最新のビットでは一度だけ尋ねます。

+0

、問題がNinjectServiceLocatorマッピング例外をスローしていることを:私は今の私が使用しているNinjectの大きい知識を持っている人が作成した「適切な」1があるだろうと確信していますが見つかりません。私はさらに調査します。 –

+0

@Discofunkそうですね。しかし、フレームワークはあなたのためにその例外を飲み込むでしょう。 –

+0

私は参照してください。デバッグVS2010で実行されている場合、例外が発生しますが、その後は飲み込まれているようです。 –

0

最後に、Ninject用のIDependencyResolverを作成するほうがよいでしょう。おそらく、

public class NinjectDependencyResolverAdapter : IDependencyResolver 
{ 
    private readonly IKernel kernel; 

    public NinjectDependencyResolverAdapter(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    #region Implementation of IDependencyResolver 

    public object GetService(Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 
    } 

    #endregion 
} 
+0

完全な実装については、https://github.com/sethwebster/NinjectDependencyResolverを参照してください。 –

関連する問題