我被卡住了.我正在使用这里概述的wcf web api p6 Ninject与WCF Web API Preview 5一起使用的方法,但是测试版中的mvc实现有些不同.这里有一篇很好的文章http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver讨论构建自己的自定义依赖项解析器,但是我想使用我用于我的mvc视图控制器的相同实现...例如Ninject.我在文章中也尝试了一些基于IoC Unity示例的内容,但还没有任何内容消失.任何帮助我指向正确方向的人都会非常感激.我也会继续自己挖掘.提前致谢!
这就是我在的地方.我正在使用WebActivator来引导代码,但我已经把它放到了Application_Start()中,只是为了更多的东西.
protected void Application_Start()
{
var kernel = new StandardKernel(new MyNinjectModule());
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
}
Run Code Online (Sandbox Code Playgroud)
和我收到以下错误:
类型Ninject.Web.Mvc.NinjectDependencyResolver似乎不执行Microsoft.Practices.ServiceLocation.IServiceLocator.
参数名称:commonServiceLocator
找到解决方案
也许有/将会有一个更优雅的方式,但现在这对我有用.我也在这里添加我的自定义消息处理程序.
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
public class ApiBootstrapper
{
public static void Start()
{
var kernel = new StandardKernel(new MyNinjectModule());
var resolver = new NinjectDependencyResolver(kernel);
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
}
}
}
Run Code Online (Sandbox Code Playgroud) 所以我一直在玩最新版本的WCF Web API,并决定用它来实现Ninject.
基于我读过的内容,我需要实现IResourceFactory接口,该接口需要以下方法:
public object GetInstance(System.Type serviceType,
System.ServiceModel.InstanceContext instanceContext,
System.Net.Http.HttpRequestMessage request);
public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext,
object service);
Run Code Online (Sandbox Code Playgroud)
所以我把鸡抓了下面:
public class NinjectResourceFactory : IResourceFactory
{
private readonly IKernel _kernel;
public NinjectResourceFactory()
{
var modules = new INinjectModule[]
{
new ServiceDIModule(), //Service Layer Module
new RepositoryDIModule(), //Repo Layer Module
new DataServiceDIModule()
};
_kernel = new StandardKernel(modules);
}
#region IResourceFactory Members
public object GetInstance(Type serviceType,
InstanceContext instanceContext,
HttpRequestMessage request)
{
return Resolve(serviceType);
}
public void ReleaseInstance(InstanceContext instanceContext, object service)
{ …Run Code Online (Sandbox Code Playgroud) 我遇到了麻烦,制作了Ninject和WebAPI.All合作.我将更加具体:
首先,我玩了WebApi.All包,看起来它对我来说很好.
第二,我加入RegisterRoutes的Global.asax下一行:
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
Run Code Online (Sandbox Code Playgroud)
所以最终的结果是:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好,但是当我试图将用户重定向到特定的操作时,例如:
return RedirectToAction("Index", "Home");
Run Code Online (Sandbox Code Playgroud)
localhost:789/api/contacts?action=Index&controller=Home
是不好的.我划了一条线RegisterRoute,现在它看起来像:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new …Run Code Online (Sandbox Code Playgroud)