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); //这里用一个简单的视图来返回从数据库中获取的结果,即如图开始部分
}
}
}