網上查看了很多文章,照着複製的代碼,始終不對,後面發現有些是缺少引用,有些缺失代碼,我這裏也是照搬被人的代碼做了一些改動,先上項目結構圖:
新建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,我這裏做了一點改動,剛學習,有不對的地方或者可以改進的地方請大家指點一下,謝謝