我正在尝试弄清楚如何将 Ninject 与 Azure 移动应用后端结合使用。移动应用程序后端是一个 .Net Web 应用程序。
按照 NuGet 包部分中的 Ninject.Web.Common wiki 中的 Ninject 文档,我相信当我安装 Ninject.Web.Common.WebHost 时,我应该在 App_Start 文件夹中获得一个 NinjectWebCommon 类。我不明白,我不确定我是否遵循了正确的指示。有人能指出我正确的方向吗?谢谢。
由于我们使用的是 Mobile App .NET Backend,它是一个 OWIN 项目,而不是常见的 ASP.NET MVC 项目,因此它没有像上面提到的文章那样使用
HttpApplication
(在 Ninject 中,NinjectHttpApplication
扩展了 HttpApplication
)。
我们可以在“App_Start”文件夹下创建
NinjectWebCommon
类,并通过方法NinjectWebCommon
在
RegisterServices(IKernel kernel)
中注册我们的IDependencyResolver
这是一个关于使用 Ninject 定义 IDependencyResolver 的演示:
public class NinjectDependencyResolver : IDependencyResolver
{
private IKernel kernal;
public NinjectDependencyResolver(IKernel kernalParam)
{
kernal = kernalParam;
AddBindings();
}
public object GetService(Type serviceType)
{
return kernal.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernal.GetAll(serviceType);
}
public void AddBindings()
{
kernal.Bind<IValueCalculator>().To<LinqValueCalculator>().InRequestScope();
kernal.Bind<IDiscountHelper>().To<DefaultDiscountHelper>().WithConstructorArgument("discount", 10m);
kernal.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();
}
}
在 NinjectWebCommon 中注册我们的 NinjectDependencyResolver:
public static class NinjectWebCommon
{
。。。
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
System.Web.Mvc.DependencyResolver.SetResolver(new
EssentialTools.Infrastructure.NinjectDependencyResolver(kernel));
}
}
然后我们可以在控制器构造函数中使用 DI:
public class HomeController : Controller
{
private IValueCalculator calc;
public HomeController(IValueCalculator calc)
{
this.calc = calc;
}
//........
}