在ASP.NET Web API和ASP.NET Web MVC中使用Ninject

摘要:
首先附上源代码下载地址1.准备1.创建一个名为MvcDemo的空解决方案2.创建一个空的MVC应用程序,名为MvcDemo。WebUI 3.使用NuGet安装Ninject库2.使用ASP NETMVC使用Ninject1创建Product实体类。代码如下:publicclassProduct{publicintProductId{get;set;}publicstringName{get;se

先附上源码下载地址

一、准备工作

1、新建一个名为MvcDemo的空解决方案
2、新建一个名为MvcDemo.WebUI的空MVC应用程序
3、使用NuGet安装Ninject库
在ASP.NET Web API和ASP.NET Web MVC中使用Ninject第1张
 

二、在ASP.NET MVC中使用Ninject

1、新建一个Product实体类,代码如下:
public class Product
    {
        public int ProductId { get; set ; }
        public string Name { get; set ; }
        public string Description { get; set ; }
        public decimal Price { get; set ; }
        public string Category { set; get ; }
    }
2、添加一个IProductRepository接口及实现
public interface IProductRepository
    {
        IQueryable <Product > Products { get; }
 
        IQueryable <Product > GetProducts();
 
        Product GetProduct();
 
        bool AddProduct(Product product);
 
        bool UpdateProduct(Product product);
 
        bool DeleteProduct(int productId);
    }
 
public class ProductRepository : IProductRepository
    {
        private List < Product> list;
        public IQueryable < Product> Products
        {
            get { return GetProducts(); }
        }
 
        public IQueryable < Product> GetProducts()
        {
            list = new List < Product>
            {
                new Product {ProductId = 1,Name = "苹果",Category = "水果" ,Price = 1},
                new Product {ProductId = 2,Name = "鼠标",Category = "电脑配件" ,Price = 50},
                new Product {ProductId = 3,Name = "洗发水",Category = "日用品" ,Price = 20}
            };
            return list.AsQueryable();
        }
 
        public Product GetProductById( int productId)
        {
            return Products.FirstOrDefault(p => p.ProductId == productId);
        }
 
        public bool AddProduct( Product product)
        {
            if (product != null )
            {
                list.Add(product);
                return true ;
            }
            return false ;
        }
 
        public bool UpdateProduct( Product product)
        {
            if (product != null )
            {
                if (DeleteProduct(product.ProductId))
                {
                    AddProduct(product);
                    return true ;
                }
            }
            return false ;
        }
 
        public bool DeleteProduct( int productId)
        {
            var product = GetProductById(productId);
            if (product != null )
            {
                list.Remove(product);
                return true ;
            }
            return false ;
        }
    }
3、添加一个实现了IDependencyResolver接口的Ninject依赖解析器类
public class NinjectDependencyResolverForMvc : IDependencyResolver
    {
        private IKernel kernel;
 
        public NinjectDependencyResolverForMvc( IKernel kernel)
        {
            if (kernel == null )
            {
                throw new ArgumentNullException( "kernel" );
            }
            this .kernel = kernel;
        }
 
        public object GetService( Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }
 
        public IEnumerable < object> GetServices( Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }
    }
4、添加一个NinjectRegister类,用来为MVC和WebApi注册Ninject容器
public class NinjectRegister
    {
        private static readonly IKernel Kernel;
        static NinjectRegister()
        {
            Kernel= new StandardKernel ();
            AddBindings();
        }
 
        public static void RegisterFovMvc()
        {
            DependencyResolver .SetResolver(new NinjectDependencyResolverForMvc (Kernel));
        }
 
        private static void AddBindings()
        {
            Kernel.Bind<IProductRepository >().To< ProductRepository>();
        }
    }
5、在Global.asax文件的Application_Start方法中添加下面代码:
NinjectRegister .RegisterFovMvc(); //为ASP.NET MVC注册IOC容器
6、新建一个名为ProductController的控制器,ProductController的构造函数接受了一个IProductRepository参数,当ProductController 被实例化的时候,Ninject就为其注入了ProductRepository的依赖.
public class ProductController : Controller
    {
        private IProductRepository repository;
 
        public ProductController(IProductRepository repository)
        {
            this .repository = repository;
        }
 
        public ActionResult Index()
        {
            return View(repository.Products);
        }
    }
7、视图代码用来展示商品列表
@model IQueryable<MvcDemo.WebUI.Models. Product >
 
@{
    ViewBag.Title = "MvcDemo Index" ;
}
 
@ foreach ( var product in Model)
{
    <div style=" border-bottom :1px dashed silver ;">
        < h3> @product.Name </ h3>
        < p> 价格:@ product.Price </ p >
    </div >
}
8、运行效果如下:
 在ASP.NET Web API和ASP.NET Web MVC中使用Ninject第2张
 

三、在ASP.NET Web Api中使用Ninject

1、添加一个实现了IDependencyResolver接口的Ninject依赖解析器类
namespace MvcDemo.WebUI.AppCode
{
    public class NinjectDependencyResolverForWebApi : NinjectDependencyScope ,IDependencyResolver
    {
        private IKernel kernel;
 
        public NinjectDependencyResolverForWebApi( IKernel kernel)
            : base (kernel)
        {
            if (kernel == null )
            {
                throw new ArgumentNullException( "kernel" );
            }
            this .kernel = kernel;
        }
 
        public IDependencyScope BeginScope()
        {
            return new NinjectDependencyScope(kernel);
        }
    }
 
    public class NinjectDependencyScope : IDependencyScope
    {
        private IResolutionRoot resolver;
 
        internal NinjectDependencyScope(IResolutionRoot resolver)
        {
            Contract .Assert(resolver != null );
 
            this .resolver = resolver;
        }
 
        public void Dispose()
        {
            resolver = null ;
        }
 
        public object GetService( Type serviceType)
        {
            return resolver.TryGet(serviceType);
        }
 
        public IEnumerable < object> GetServices( Type serviceType)
        {
            return resolver.GetAll(serviceType);
        }
    }
}
2、在NinjectRegister类中添加注册依赖解析器的方法
public static void RegisterFovWebApi( HttpConfiguration config)
        {
            config.DependencyResolver = new NinjectDependencyResolverForWebApi (Kernel);
        }
3、在Global.asax文件的Application_Start方法中添加下面代码:
NinjectRegister .RegisterFovWebApi( GlobalConfiguration.Configuration); //为WebApi注册IOC容器
4、新建一个名为MyApiController的控制器
public class MyApiController : ApiController
    {
        private IProductRepository repository;
 
        public MyApiController(IProductRepository repository)
        {
            this .repository = repository;
        }
        // GET api/MyApi
        [ HttpGet ]
        public IEnumerable < Product> Get()
        {
            return repository.Products;
        }
 
        // GET api/MyApi/5
        [ HttpGet ]
        public Product Get( int id)
        {
            return repository.Products.FirstOrDefault(p => p.ProductId == id);
        }
    }
5、视图代码用来展示商品列表
@{
    ViewBag.Title = "ApiDemo Index" ;
}
 
< script>
    function GetAll() {
        $.ajax({
            url: "/api/MyApi" ,
            type: "GET" ,
            dataType: "json" ,
            success: function (data) {
                for (var i = 0; i < data.length; i++) {
                    $( "#list" ).append("<h3>" + data[i].Name + "</h3>");
                    $( "#list" ).append("<p>价格:" +data[i].Price + "</p>");
                }
            }
        });
    }
 
    $( function () {
        GetAll();
    });
</ script>
 
< h2> Api Ninject Demo </h2 >
< div id="list" style=" border-bottom :1px dashed silver ;"></ div >
   
6、运行效果如下:
 在ASP.NET Web API和ASP.NET Web MVC中使用Ninject第3张
至此,我们就实现了共用一个NinjectRegister类完成了为MVC和Web Api注册Ninject容器

免责声明:文章转载自《在ASP.NET Web API和ASP.NET Web MVC中使用Ninject》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇graphicview和widgets没本质区别。它只是更轻量级,更灵活,性能更高的widgetsMicro:bit第一集——打造一颗闪烁的心下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端调用api接口方法总结

我用得最多的大概就是jquery中的ajax了吧,就从ajax总结起走: 一、ajax: 参数解释:(主要就用到url、type、data、dataType、success、error等,其他的看需求而定) $.ajax({   url:" ", //请求的地址,类型为string type:" ", //请求方式,两种“get”或者“...

说说高斯过程回归

说说高斯过程回归作者介绍:新浪微博ID @妖僧老冯, 9月将赴南京大学(直博生),方向是机器学习与数据挖掘 编者:小便和作者打过几次交道,一直以为是他是已“修成正果”的某某博士,便“毕恭毕敬”地去邀请他写篇牛文。细聊之后才得知小伙子原来是90后,9月份才博士入学。这篇文章对GP进行了深度科普,数学公式是有一些的,但耐心读读,都不是问题的。高斯过程是机器学习...

X oracle的内存参数 shmall shmmax shmmni sem

原文地址   :   https://blog.csdn.net/lihuarongaini/article/details/78540357第四章  Oracle内核参数 查看:more /proc/sys/kernel/shmmax 临时生效:echo 3145728 > /proc/sys/kernel/shmmax 永久生效,修改文件:/et...

CentOS 7磁盘寻找不到,卡在sulogin,造成的开机失败问题--Error getting authority...

今天早上使用内网gitlab仓库的时候,发现页面无法打开,ssh也无法连接。 到机房接上显示器,发现如下错误: Error getting authority: Error initializing authority: Could not connect: No such file or directory (g-io-error-quark, 1)...

Android x86镜像分析

这几天可能要接个Android的项目,基于x86平台。所以先了解一下android的安装过程。在其官方网站上下载了Android的img,先面就解压出来看看吧,需要说明的是以下的操作都是在root用户下进行的。 mkdir android mount android-x86-4.3-20130725.iso android 通过以上的命令可以把我们下载...

Elasticsearch状态API接口排障总结

ES的Restful API,共四类API: 1. 检查集群、节点、索引等健康与否,以及获取其相应状态。 2. 管理集群、节点、索引及元数据 3. 执行CRUB操作(即:增删查改) 4. 执行高级操作,如:paging,filtering等。 ES API的访问接口: TCP:9200,并且ES是基于HTT...