IOC依赖注入-AutoFac 使用

示例效果:

示例项目创建步骤:

1.创建一个MVC项目 AutoFacDemo

 安装AutoFac    

  install-package Autofac -version 5.2.0  -projectname AutoFacDemo

  install-package Autofac.Mvc5 -version 5.0.0 -projectname AutoFacDemo

2.创建控制器类,首先在项目中创建一个Infrastructure文件夹,在其中创建类IocConfig

 

using Autofac;
using Autofac.Integration.Mvc;
using AutoFacDemo.Abstract;
using AutoFacDemo.Services;
using System.Web.Mvc;
namespace AutoFacDemo.Infrastructure
{
public class IocConfig
{
public static void RegisterDependencies()
{
var builder = new ContainerBuilder();   //创建一个容器,和Ninject注入器创建一个Kernenl类似
builder.RegisterControllers(typeof(MvcApplication).Assembly);  //把当前框架的启动项类加入到容器中(位于Global.asax文件中)
builder.RegisterType<EFProductRepository>().As<IProductRepository>();//注册类与接口,类似Ninject的kernel.Bind<C>().to<I>()
//autofac注册依赖
IContainer container = builder.Build();  //实例化容器
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //利用System.Web.Mvc的DependencyResolver.SetResolver() 来注册要注入的依赖对象,这里传入的是container,如果是Ninject 则直接传入IKernel 引用 kernel

}

}
}

3.在Global.asax文件中加入我们的IocConfig类中的静态方法,让程序启动时执行,这样就初步完成了AutoFac的以来注入框架了

using AutoFacDemo.Infrastructure;
using System.Web.Mvc;
using System.Web.Routing;
namespace AutoFacDemo
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
IocConfig.RegisterDependencies();
}
}
}

4.创建接口与实现类,这里用IProductRespository来模拟,在AutoFacDemo项目中创建Abstract 文件夹,在其中加入IProductRepository类文件

using AutoFacDemo.Models;
using System.Linq;
namespace AutoFacDemo.Abstract
{
public interface IProductRepository
{
IQueryable<Product> Prouducts { get; }
}
}

5.创建接口的实现类,在AutoFacDemo项目中创建Services文件夹,在其中创建EFProductRepository,并引入AutoFacDemo.Abstract和AutoFacDemo.Model命名空间

using AutoFacDemo.Abstract;
using AutoFacDemo.Models;
using System.Linq;

namespace AutoFacDemo.Services
{
public class EFProductRepository : IProductRepository
{
private EFDbContext dbContext = new EFDbContext();  //这里使用了EF框架
public IQueryable<Product> Prouducts
{
get
{
return dbContext.Products.AsQueryable();
}
}
}
}

6.创建数据库实体框架类EFDbContext,因为这里使用的了EF,因此需要安装EntityFramework,并在配置文件中添加数据库连接信息如下(绿色文字):

<connectionStrings>
<add name="sqlserverconn" connectionString="Server=WIN-HD8JVF2J0A0;Database=SportsStore;User Id=sa;Password=sundh1981@163.com;" providerName="System.Data.SqlClient"/>
</connectionStrings>

using AutoFacDemo.Models;
using System.Data.Entity;
namespace AutoFacDemo.Services
{
public class EFDbContext:DbContext
{
public EFDbContext() : base("name=sqlserverconn") { }  //在配置文件中增加数据库链接字符串:

public DbSet<Product> Products { get; set; }

}
}

7.创建模型类(这里需要引用 using System.ComponentModel.DataAnnotations.Schema;为了使用注解来映射数据表中的字段和表名)

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
namespace AutoFacDemo.Models
{
[Table("Products")]
public class Product
{
   public int ProductId { get; set; }
   [Column("Name")]
   public string ProductName { get; set; }
   public decimal Price { get; set; }
   public string Category { get; set; }
   public string Description { get; set; }
}
}

8.创建控制器,在Controllers文件夹中创建控制器类,修改App_Start文件夹下的路由文件RouteConfig.cs,把Home改成 Buy,并把项目的Web属性改为特定页,启动项目即可

using AutoFacDemo.Abstract;
using System.Web.Mvc;
namespace AutoFacDemo.Controllers
{
public class BuyController : Controller
{
private IProductRepository repository;
public BuyController(IProductRepository repo)   //有了前面的功课,我们这里就可以放心的使用接口参数了,不用考虑实例化的问题了,那是Autofac应该干的事
{
repository = repo;
}
// GET: Buy
public ActionResult Index()
{
return View(repository.Prouducts);  //这里用一个简单的视图来返回从数据库中获取的结果,即如图开始部分
}
}
}

原文地址:https://www.cnblogs.com/sundh1981/p/13895669.html