asp.net mvc和webapi试用ninject依赖注入

1 篇文章 0 订阅
1 篇文章 0 订阅

学习asp.net的过程中看了《精通ASP.NET MVC5》其中依赖注入使用了ninject。笔者使用的3.0版本。具体实现如下:

第一步:在nuget里面添加后会自动在APP_Start里面生成NinjetWebCommon.cs文件。

NinjectWebCommon[assembly: WebActivator.PreApplicationStartMethod(typeof(SportStore.WebUI.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(SportStore.WebUI.App_Start.NinjectWebCommon), "Stop")]

namespace SportStore.WebUI.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using Ninject.Web.Common.WebHost;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }
        
        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }
        
        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            
            RegisterServices(kernel);
            return kernel;
        }

        /// <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 SportStore.WebUI.Infrastructure.NinjectDependencyResolver(kernel));
        }        
    }
}

第二步我们需要实现依赖解析接口 :创建NinjectDependencyResolver.cs文件,实现IDependencyResolver。并在NinjetWebCommon文件里面注册就可以快乐的binding了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Ninject;
using System.Web.Mvc;
using Ninject.Web.Common;
using Moq;
using SportStore.Domain.Entities;
using SportStore.Domain.Abstract;
using SportStore.Domain.Concreate;
using System.Configuration;
using SportStore.WebUI.Infrastructure.Abstract;
using SportStore.WebUI.Infrastructure.Concrete;

namespace SportStore.WebUI.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;
        public NinjectDependencyResolver(IKernel kernekParam )
        {
            kernel = kernekParam;
            AddBindings();
        }
        public object GetService( Type serviceType )
        {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices( Type serviceType )
        {
            return kernel.GetAll(serviceType);
        }
        private void AddBindings()
        {
            //Mock<IProductsRepository> mock = new Mock<IProductsRepository>();
            //mock.Setup(m => m.Products).Returns(new List<Product>
            //{
            //    new Product {Name="FootBALL",Price=25 ,Description="Nike"},
            //    new Product {Name="Surf board",Price=179 },
            //    new Product {Name="Running shoes",Price=95 }
            //});
            kernel.Bind<IProductsRepository>().To<EFProductRepository>();
            EmailSettings emailSettings = new EmailSettings
            {
                WriteAsFile = bool.Parse(ConfigurationManager.AppSettings["Email.WriteAsFile"] ?? "false")
            };
            kernel.Bind<IOrderProcessor>().To<EmailOrderProcessor>().WithConstructorArgument("settings", emailSettings);

            kernel.Bind<IAuthProvider>().To<FormsAuthProvider>();
        }
    }
}

然而在使用最新版本时,发现并不会自动生成NinjetWebCommon文件。当然我们可以用旧版的文件修改实现。后来去git查找发现并不需要这么麻烦了。直接继承NinjectHttpApplication。实现抽象类里面的CreateKernel()就可以更快乐的bind了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 .NET Framework 中使用 MVC 架构时,可以使用依赖注入(Dependency Injection,简称 DI)来解决对象之间的依赖关系。依赖注入是一种设计模式,通过将对象的创建和管理委托给外部容器来实现。 在 MVC 中使用依赖注入的好处是可以降低代码的耦合性,提高可维护性和可测试性。以下是在 .NET Framework MVC 中使用依赖注入的一般步骤: 1. 配置依赖注入容器:您可以使用第三方的依赖注入容器,如 Autofac、Unity、Ninject 等,或者使用 .NET Framework 自带的简单容器(如 `UnityContainer`)。 2. 注册依赖项:在配置阶段,您需要将控制器、服务、存储库等需要被注入的对象注册到容器中。这样容器就能够识别和管理这些对象。 3. 声明依赖关系:在需要使用依赖项的地方(如控制器的构造函数),通过构造函数或属性注入等方式声明依赖关系。容器会自动解析和提供所需的对象实例。 4. 解析依赖项:在运行时,容器会根据对象的声明和注册信息来解析依赖关系,并将所需的对象实例提供给相应的对象。 下面是一个使用 .NET Framework MVC 和 Unity 容器的示例: 首先,安装 Unity 容器的 NuGet 包(例如通过 NuGet 包管理器控制台运行 `Install-Package Unity`)。 然后,在 Global.asax.cs 文件的 Application_Start 方法中配置 Unity 容器: ```csharp protected void Application_Start() { // 创建 Unity 容器 var container = new UnityContainer(); // 注册依赖项 container.RegisterType<IMyService, MyService>(); // 设置 MVC 依赖解析器为 UnityDependencyResolver DependencyResolver.SetResolver(new UnityDependencyResolver(container)); // 其他 MVC 配置... } ``` 接下来,在控制器中声明依赖关系: ```csharp public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } // 控制器动作方法... } ``` 现在,当 MVC 框架创建 MyController 实例时,Unity 容器会自动解析 IMyService 接口的实现(如 MyService),并将其注入到控制器的构造函数中。 这样,您就可以通过依赖注入来实现对象之间的解耦和灵活性,使代码更加可测试和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值