使用 Asp.Net MVC 和 Web Api 配置 Ninject
我已經設置了我的項目
Ninject IoC。我的項目有正常
Asp.Net MVC控制器和Web Api控制器。現在,Ninject適用於Web Api但Ninject不適用於正常Asp.MVC控制器。我的正常 MVC 控制器實現;
public class GalleryController : BaseController { public GalleryController(IUow uow) { Uow = uow; } ........ }與正常控制器一起使用時出錯
An error occurred when trying to create a controller of type 'Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]但是,當我使用Web Api嘗試相同的程式碼時,它可以工作
public class GalleryController : BaseApiController { public GalleryController(IUow uow) { Uow = uow; } ...... }我的界麵包含不同的儲存庫(工廠模式)
public interface IUow { // Save pending changes to the data store. void Commit(); //Repositoryries IRepository<Gallery> Gallery { get; } IMenuRepository Menus { get; } }
NinjectDependencyScope班級;public class NinjectDependencyScope : IDependencyScope { private IResolutionRoot resolver; internal NinjectDependencyScope(IResolutionRoot resolver) { Contract.Assert(resolver != null); this.resolver = resolver; } public void Dispose() { var disposable = resolver as IDisposable; if (disposable != null) disposable.Dispose(); resolver = null; } public object GetService(Type serviceType) { if (resolver == null) throw new ObjectDisposedException("this", "This scope has already been disposed"); return resolver.TryGet(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { if (resolver == null) throw new ObjectDisposedException("this", "This scope has already been disposed"); return resolver.GetAll(serviceType); } }
NinjectDependencyResolver班級;public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver { private IKernel kernel; public NinjectDependencyResolver(IKernel kernel) : base(kernel) { this.kernel = kernel; } public IDependencyScope BeginScope() { return new NinjectDependencyScope(kernel.BeginBlock()); } }
NinjectGlobal.asax 的配置;public class IocConfig { public static void RegisterIoc(HttpConfiguration config) { var kernel = new StandardKernel(); // Ninject IoC //kernel.Load(Assembly.GetExecutingAssembly()); //only required for asp.net mvc (not for webapi) // These registrations are "per instance request". // See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/ kernel.Bind<RepositoryFactories>().To<RepositoryFactories>() .InSingletonScope(); kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>(); kernel.Bind<IUow>().To<Uow>(); // Tell WebApi how to use our Ninject IoC config.DependencyResolver = new NinjectDependencyResolver(kernel); } }全球.asax
protected void Application_Start() { // Tell WebApi to use our custom Ioc (Ninject) IocConfig.RegisterIoc(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfig.CustomizeConfig(GlobalConfiguration.Configuration); AreaRegistration.RegisterAllAreas(); }
經過大量搜尋,事實證明我們無法將 Ninject 與 web api 和正常 mvc 一起使用。我的意思是,我們必須單獨配置儲存庫。
然後我找到了一篇很好的文章,它解釋瞭如何將 Ninject 與 asp.net mvc 和 web api 一起使用:http: //www.codeproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and- webapi-我們
現在,我沒有得到錯誤,它正在工作:D
更新1:
我寫了一些要點來幫助使用 MVC 和 Web Api 配置 Ninject。只需包含文件:
- <https://gist.github.com/odytrice/5821087>(用於 MVC)
- <https://gist.github.com/odytrice/5842010>(用於WebApi)
要為具體類型添加綁定,只需將它們放在
Load()MainModule 的方法中。您可以創建任意數量的模組來保持綁定的組織性。但您還必須將它們添加到Modules屬性中返回的數組中。然後添加到
Application_Start()方法中
NinjectContainer.RegisterModules(NinjectModules.Modules)(對於 MVC)NinjectHttpContainer.RegisterModules(NinjectHttpModules.Modules)(對於 WebApi)請注意,您可以將相同
NinjectModules.Modules的內容用於 MVC 和 WebApi 註冊。為了清楚起見,我只是將其分開更新:記住從你的項目中刪除 NinjectWebCommon.cs,因為它在執行時載入和引導一個新核心,不幸的是它只適用於 MVC。
更新:您也可以使用
NinjectContainer.RegisterAssembly()(對於 MVC)NinjectHttpContainer.RegisterAssembly()(對於 WebApi)這將掃描您目前的程序集以查找所有模組。這樣,您可以將模組放在項目中的任何位置,並且將被註冊