将 Ninject 与 Azure 移动应用程序后端结合使用

问题描述 投票:0回答:1

我正在尝试弄清楚如何将 Ninject 与 Azure 移动应用后端结合使用。移动应用程序后端是一个 .Net Web 应用程序。

按照 NuGet 包部分中的 Ninject.Web.Common wiki 中的 Ninject 文档,我相信当我安装 Ninject.Web.Common.WebHost 时,我应该在 App_Start 文件夹中获得一个 NinjectWebCommon 类。我不明白,我不确定我是否遵循了正确的指示。有人能指出我正确的方向吗?谢谢。

.net ninject azure-mobile-services
1个回答
0
投票

由于我们使用的是 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;
    }

    //........
} 
© www.soinside.com 2019 - 2024. All rights reserved.