Asp.net

使用 Asp.Net MVC 和 Web Api 配置 Ninject

  • May 5, 2013

我已經設置了我的項目Ninject IoC

我的項目有正常Asp.Net MVC控制器和Web Api控制器。現在,Ninject適用於Web ApiNinject不適用於正常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:

還可以嘗試使用 .NET Framework 4.5 在 MVC 4 Web API 中編寫依賴注入的簡單實現

我寫了一些要點來幫助使用 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)

這將掃描您目前的程序集以查找所有模組。這樣,您可以將模組放在項目中的任何位置,並且將被註冊

引用自:https://stackoverflow.com/questions/16382982