1

プロジェクトをWCFWebAPIからASP.NETWebAPIに変換しています-MSに感謝します:(

セルフホスティング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(object)を使用すると少し汚れた感じがしますが、私が知る限り、これは機能しているようです。

私が今抱えている問題は、それを実行しようとすると、登録されなくなったバインディングがたくさんあることです(つまりIHttpContollerFactoryILoggerなど)。

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

私は何かが足りないのですか?

4

2 に答える 2

2

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

于 2012-03-28T23:46:59.893 に答える
0

結局、Ninject用のIDependencyResolverを作成する方がおそらく良いでしょう。Ninjectの知識が豊富な人が作成した「適切な」ものがあると確信していますが、今のところ私は次のものを使用しています。

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
}
于 2012-03-29T15:48:29.583 に答える