IIS WebAPIからOwinHostに移行しています。nugetパッケージの最新のプレリリースバージョンを使用して、ここの手順を正常に使用しました:
https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application
これが私のコードのスタブです:
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
}
private static StandardKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
RegisterServices(kernel);
return kernel;
}
private static void RegisterServices(IKernel kernel)
{
...
}
しかし、私のコードとドキュメントの例では、Ninjectカーネルは起動後まで作成されません。ただし、Corsのスタートアップ登録プロセスとOAuthミドルウェア登録でNinject DIが必要です。OwinHostに移行する前に、次のようにすることができます。
public void Configuration(IAppBuilder app)
{
_bootstrapper = new Bootstrapper();
_bootstrapper.Initialize(CreateKernel);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// USE _boostrapper.Kernel here
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
}
しかし、内部的には、OwinBootstrapper.ExecuteがCreateKernelとbootstrapper.Initializeを再度呼び出すことになり、悪い結果を招きます。
スタートアップ内でninjectカーネルを作成して使用し、それでもNinject/WebAPIミドルウェアを登録する正しい方法は何ですか?
次のnuget-packagesをアプリケーションに追加します。
Web APIバージョン5.0.0.0を使用している場合は、互換性の問題を回避するために リポジトリからNinject Resolverクラス もダウンロードする必要があります。
カーネルオブジェクトを返す静的メソッドを作成する
public static class NinjectConfig
{
public static IKernel CreateKernel()
{
var kernel = new StandardKernel();
//Create the bindings
kernel.Bind<IProductsRepository>().To<ProductRepository>();
return kernel;
}
}
次に、スタートアップクラスでninjectを使用できます
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.DependencyResolver = new NinjectResolver(NinjectConfig.CreateKernel());
config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id=RouteParameter.Optional });
app.UseWebApi(config);
}
}
kernel
を手動で作成し、UseNinjectMiddleware
に別のものを作成する代わりに同じものを使用させる。
public void Configuration(IAppBuilder app)
{
var kernel = CreateKernel()
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// USE kernel here
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
}
Olifの投稿に加えて:
インストールパッケージninject.extensions.conventions
スタートアップクラスに次を追加します。
手動でバインドする代わりに:
public static IKernel CreateKernel() { var kernel = new StandardKernel(); //Create the bindings kernel.Bind<IProductsRepository>().To ProductRepository (); return kernel; }
これで次のことができます。
kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.BindDefaultInterface();
});
これはあなたのアセンブリを調べ、自動的にバインドを行います。