网上查看了很多文章,照着复制的代码,始终不对,后面发现有些是缺少引用,有些缺失代码,我这里也是照搬被人的代码做了一些改动,先上项目结构图:
新建WEB MVC项目,我使用的VS是2017版
1,添加引用,使用nugut添加两个引用:Autofac,Autofac.Mvc5(很多别的文章都没有说要添加Autofac.Mvc5,可能是使用的版本不一样,这里都使用的最新版)
2,Model添加一个实体类
public class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
}
3,Iservice添加一个接口
public interface IUserInfoService
{
List<UserInfo> GetUsers();
}
4,Service实现接口
public class UserInfoService : IUserInfoService
{
public List<UserInfo> GetUsers()
{
var list = new List<UserInfo>();
list.Add(new UserInfo { Age = 18, Name = "张三" });
list.Add(new UserInfo { Age = 25, Name = "李四" });
list.Add(new UserInfo { Age = 25, Name = "王五" });
return list;
}
}
5,正式使用,在MVC项目中创建一个autofac的注册类
public class AutofacConfig
{
/// <summary>
/// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
/// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
/// </summary>
public static void Register()
{
//实例化一个autofac的创建容器
var builder = new ContainerBuilder();
//告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
Assembly controllerAss = Assembly.Load("AutofacIOCDemo");
builder.RegisterAssemblyModules(controllerAss);
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//如果有Dal层的话,注册Dal层的组件
//告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例
//Assembly dalAss = Assembly.Load("IService");
//创建respAss中的所有类的instance以此类的实现接口存储
//builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces();
//告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例
Assembly serviceAss = Assembly.Load("Service");
//创建serAss中的所有类的instance以此类的实现接口存储
builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces();
//创建一个Autofac的容器
var container = builder.Build();
//将MVC的控制器对象实例 交由autofac来创建
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
6,在Global的Application_Start中启用autofac注册类
protected void Application_Start()
{
//注册
AutofacConfig.Register();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
7,在控制器中调用获取userinfo数据,并在视图中展示出来
private IUserInfoService userinfoService;
public HomeController(IUserInfoService _userinfoService,) {
userinfoService = _userinfoService;
}
public ActionResult Index()
{
List<UserInfo> users = userinfoService.GetUsers();
ViewBag.users = users;
return View();
}
@{
ViewBag.Title = "Home Page";
}
@foreach (var item in ViewBag.users)
{
<tr>
<td>@item.Age</td>
<td>@item.Name</td>
</tr>
}
8,补充单个注册的方式,之前的方式是用注册类注册所有的Service,这里是单个注册,不用注册类
protected void Application_Start()
{
// 创建autofac管理注册类的容器实例
var builder = new ContainerBuilder();
//注册组件(注意:在注册时添加了UserInfoService的引用,其实还是耦合的,在不分层的项目中好用)
builder.RegisterType<UserInfoService>().As<IUserInfoService>();
//使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//生成具体的实例
//var container = builder.Build();
//下面就是使用MVC的扩展 更改了MVC中的注入方式.
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
9,原文地址:https://www.cnblogs.com/wyy1234/p/9144669.html,我这里做了一点改动,刚学习,有不对的地方或者可以改进的地方请大家指点一下,谢谢