Asp.Net WebApi2中实现Autofac的注入

阅读此文前请先掌握小白快速入手Asp.Net WebApi2

1、使用NuGet添加Autofac、Autofac ASP.NET MVC5 Integration和Autofac ASP.NET Web API2.2 Integration

如下图:

235854_iM3O_1995422.png

2、创建类库

  1)在解决方案中创建IocProject.Model(实体模型层)、IocProject.Dao(数据访问层)、IocProject.Service(逻辑业务层)类库,如下图:

214425_W67U_1995422.png

3、创建接口和实现

  1)在IocProject.Model(实体模型层)创建实体类Product,代码如下:

public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

  2)在IocProject.Dao(数据访问层)中添加IocProject.Model层的引用,并创建ProductDao类和IProuctDao接口,代码如下:

public class ProductDao:IProductDao
    {
        public Product[] Products; 
        public ProductDao()
        {
            Products = new Product[]
            {
                new Product(){ Id = 1, Name = "一箱橙子", Price = 58 },
                new Product(){ Id = 2, Name = "三包薯片", Price = 18 },
                new Product(){ Id = 3, Name = "五瓶可乐", Price = 15 }
            };
        }

        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Product> GetProductList()
        {
            return Products;
        }

        /// <summary>
        /// 根据id查询商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Product GetProductById(int id)
        {
            return Products.FirstOrDefault(p => p.Id == id);
        }
    }
public interface IProductDao
    {
        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        IEnumerable<Product> GetProductList();

        /// <summary>
        /// 根据id查询商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Product GetProductById(int id);
    }

  3)在IocProject.Service(逻辑业务层)中添加IocProject.Model层和IocProject.Dao层的引用,并创建ProductService类和IProductService接口,代码如下:

public class ProductService:IProductService
    {
        public IProductDao _productDao;

        /// <summary>
        /// 构造器注入
        /// </summary>
        /// <param name="productDao"></param>
        public ProductService(IProductDao productDao)
        {
            _productDao = productDao;
        }

        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Product> GetProductList()
        {
            return _productDao.GetProductList();
        }

        /// <summary>
        /// 根据id查询商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Product GetProductById(int id)
        {
            return _productDao.GetProductById(id);
        }
    }
public interface IProductService
    {
        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        IEnumerable<Product> GetProductList();

        /// <summary>
        /// 根据id查询商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Product GetProductById(int id);
    }

4、修改控制器

在IocProject.WebApi中添加IocProject.Model层、IocProject.Dao层和IocProject.Service层的引用,修改控制器ProductController中的方法,代码如下:

public class ProductController : ApiController
    {
        public IProductService _productService;

        /// <summary>
        /// 构造器注入
        /// </summary>
        /// <param name="productService"></param>
        public ProductController(IProductService productService)
        {
            _productService = productService;
        }

        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Product> GetProductList()
        {
            return _productService.GetProductList();
        }

        /// <summary>
        /// 根据id查询商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Product GetProductById(int id)
        {
            return _productService.GetProductById(id);
        }
    }

5、使用Autofac注入

在App_Start文件夹下新建AutofacConfig类

public class AutofacConfig
    {
        public static void Run()
        {
            SetAutofacWebApi();
        }

        /// <summary>
        /// 注册接口和实现 
        /// </summary>
        private static void SetAutofacWebApi()
        {
            ContainerBuilder builder = new ContainerBuilder();
            HttpConfiguration config = GlobalConfiguration.Configuration;

            // Register API controllers using assembly scanning.
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            builder.RegisterType<ProductDao>().As<IProductDao>()
                .InstancePerApiRequest();
            builder.RegisterType<ProductService>().As<IProductService>()
                .InstancePerApiRequest();

            var container = builder.Build();
            // Set the WebApi dependency resolver.
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }
    }

在Global中添加以下代码

protected void Application_Start(object sender, EventArgs e)
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            //Call Autofac DI configurations   
            AutofacConfig.Run();
        }

以上就是在WebApi2中实现了Autofac的注入

6、运行项目

在浏览器Url后面加上“/api/product”查询所有的商品,加上“/api/product/2”查询单个商品,如下图:

231848_Ep6Y_1995422.png

231906_Ya9k_1995422.png

使用Postman

232743_mAux_1995422.png

232802_FVa9_1995422.png

7、总结
Autofac确实用起来很方便,上面只是简单的实现,如果想深入学习可以到Autofac官网去了解下。
最近在看相关文章,很多都太专业化了没怎么看懂,这是自己现在对IoC的一些理解,记录下来,要不然时间一久,也就忘了。
自己对IoC模式理解还很浅,希望得到各位的指点。

 

转载于:https://my.oschina.net/jokeny/blog/1595393

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值