做個筆記...
當開啟Web API專案,使用Ninject來做DI的話,可能會出現像下例的錯誤訊息

怎麼解決這個問題呢,首先打開NuGet,安裝Ninject.Web.Common

安裝完在你的App_Start目錄會多一個檔案"NinjectWebCommon.cs"
這個Class透過WebActivator來做初始化及釋放
所以安裝時也會一併參考WebActivator
接著新增一個類別,這邊取作"NinjectDependencyScope.cs"
using Ninject;
using Ninject;
using Ninject.Syntax;
using System;
using System.Web.Http.Dependencies;
namespace MvcApplication1.App_Start
{
// Provides a Ninject implementation of IDependencyScope
// which resolves services using the Ninject container.
public class NinjectDependencyScope : IDependencyScope
{
IResolutionRoot resolver;
public NinjectDependencyScope(IResolutionRoot resolver)
{
this.resolver = resolver;
}
public object GetService(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has been disposed");
return resolver.TryGet(serviceType);
}
public System.Collections.Generic.IEnumerable<object> GetServices(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has been disposed");
return resolver.GetAll(serviceType);
}
public void Dispose()
{
IDisposable disposable = resolver as IDisposable;
if (disposable != null)
disposable.Dispose();
resolver = null;
}
}
// This class is the resolver, but it is also the global scope
// so we derive from NinjectScope.
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectDependencyScope(kernel.BeginBlock());
}
}
}然後編輯"NinjectWebCommon.cs",在CreateKernel時,去指定GlobalConfiguration.Configuration.DependencyResolver...
最後就在RegisterServices加入要做DI的程式碼...

這樣就沒問題了~

參考:http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api
沒有留言:
張貼留言