与Asp.Net MVC和放大器配置Ninject;网页API [英] Configuring Ninject with Asp.Net MVC & Web Api
问题描述
我有我的设置与项目Ninject国际奥委会
。
我的项目有普通的 Asp.Net MVC
控制器和网页API
控制器。现在, Ninject
适用于网页API
,但 Ninject
没有按'与常规 Asp.MVC
控制器将不起作用。
我的常规MVC控制器执行;
公共类GalleryController:BaseController
{
公共GalleryController(IUow UOW)
{
UOW = UOW;
}
........
}
与常规控制器使用时
错误
试图创建类型的控制器时发生错误Web.Controllers.HomeController。确保控制器具有一个无参数公共构造函数。]
然而,当我尝试在同一code。与网络的API,它的工作原理
公共类GalleryController:BaseApiController
{
公共GalleryController(IUow UOW)
{
UOW = UOW;
}
......
}
我的界面,拥有不同的资源库(工厂模式)
公共接口IUow
{
//保存未决更改数据存储。
无效提交(); // Repositoryries
IRepository<画廊>画廊{搞定; }
IMenuRepository菜单{搞定; }
}
NinjectDependencyScope
类;
公共类NinjectDependencyScope:IDependencyScope
{
私人IResolutionRoot解析器; 内部NinjectDependencyScope(IResolutionRoot解析器)
{
Contract.Assert(解析!= NULL); this.resolver =解析器;
} 公共无效的Dispose()
{
VAR一次性=解析为IDisposable的;
如果(一次性!= NULL)
disposable.Dispose(); 解析器= NULL;
} 公共对象GetService的(类型的serviceType)
{
如果(解析器== NULL)
抛出新的ObjectDisposedException(本,这个范围已被释放); 返回resolver.TryGet(的serviceType);
} 公共IEnumerable的<对象> GetServices(类型的serviceType)
{
如果(解析器== NULL)
抛出新的ObjectDisposedException(本,这个范围已被释放); 返回resolver.GetAll(的serviceType);
}
}
NinjectDependencyResolver
类;
公共类NinjectDependencyResolver:NinjectDependencyScope,的IDependencyResolver
{
私人的iKernel内核; 公共NinjectDependencyResolver(内核的iKernel)
:基地(内核)
{
this.kernel =内核;
} 公共IDependencyScope BeginScope()
{
返回新NinjectDependencyScope(kernel.BeginBlock());
}
}
为Global.asax中
Ninject
配置;
公共类IocConfig
{
公共静态无效RegisterIoc(HttpConfiguration配置)
{
VAR内核=新StandardKernel(); // Ninject国际奥委会
//kernel.Load(Assembly.GetExecutingAssembly()); //只需要在asp.net的MVC(非的WebAPI)
//这些注册是每个实例的请求。
//见http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/ kernel.Bind&所述; RepositoryFactories方式>()到< RepositoryFactories>()
.InSingletonScope(); kernel.Bind&所述; IRepositoryProvider方式>()到< RepositoryProvider>();
kernel.Bind&所述; IUow方式>()到< UOW>(); //告诉的WebAPI如何使用我们的Ninject的IoC
config.DependencyResolver =新NinjectDependencyResolver(内核);
}
}
Global.asax中
保护无效的Application_Start()
{ //告诉的WebAPI使用我们自定义的IOC(Ninject)
IocConfig.RegisterIoc(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfig.CustomizeConfig(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
}
很多搜索后,原来有,我们不能被web API和定期MVC使用Ninject。我的意思是,我们必须separatly配置存储库。
所以,我当时有一个很好的文章,其中介绍了如何使用Ninject用asp.net mvc的&安培;网页API。
<一href=\"http://www.$c$cproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us\">http://www.$c$cproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us
而现在,我不明白的错误,它的工作:D
更新1:
也可以尝试<一个href=\"http://blogs.msdn.com/b/kirpas/archive/2013/08/06/writing-a-simple-implementation-of-dependency-injection-in-mvc-4-web-api-with-net-framework-4-5.aspx\">Writing一个简单的实现依赖注入的MVC 4的Web API使用.NET框架4.5
i have setup my project with Ninject IoC
.
My project has regular Asp.Net MVC
controllers and Web Api
controllers. Now, Ninject
works with Web Api
but Ninject
doesn't work with regular Asp.MVC
controllers.
My regular MVC controller implementation;
public class GalleryController : BaseController
{
public GalleryController(IUow uow)
{
Uow = uow;
}
........
}
Error when using with regular controller
An error occurred when trying to create a controller of type 'Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
However, when i try the same code with Web Api, it works
public class GalleryController : BaseApiController
{
public GalleryController(IUow uow)
{
Uow = uow;
}
......
}
my interface which holds difference repositories (the factory pattern)
public interface IUow
{
// Save pending changes to the data store.
void Commit();
//Repositoryries
IRepository<Gallery> Gallery { get; }
IMenuRepository Menus { get; }
}
NinjectDependencyScope
class;
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
class;
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());
}
}
Ninject
configuration for Global.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);
}
}
Global.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();
}
After searching alot, it turns out there we can't use Ninject with web api and regular mvc. I mean, we have to configure the Repositories separatly.
so, i then got a nice article which explains how you can use Ninject with asp.net mvc & web api.
http://www.codeproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us
And now, i don't get the error and it's working :D
Update 1:
Also try Writing a simple implementation of dependency injection in MVC 4 Web API with .NET Framework 4.5
这篇关于与Asp.Net MVC和放大器配置Ninject;网页API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!