参考网址:https://www.cnblogs.com/wyy1234/p/9144669.html
基本结构:AutoFacMvc作为ui层 ,IService类库(各种服务接口),Service类库(IService中接口的实现),Model类库(数据模型,这里使用EF)
我们的目的:实现MVC中的Controller和Service中的具体实现类解耦
获取用户列表的简单例子:
IService中的接口:
public interface IUserService
{
List<user> GetUsers();
}
Service中的实现:
public class UserService:IUserService
{
//获取用户列表
public List<user> GetUsers()
{
DbContext context = DbFactory.getDbContext();
return context.Set<user>().ToList<user>();
}
}
DbFactory中的方法:
public static DbContext getDbContext()
{
var dbContext = CallContext.GetData("DbContext") as DbContext;
if (dbContext == null) //线程在数据槽里面没有此上下文
{
dbContext = new test1Entities(); //创建一个EF上下文
CallContext.SetData("DbContext", dbContext);
dbContext.Configuration.ProxyCreationEnabled = false;
}
return dbContext;
}
第一步:通过nuget程序包管理器添加autofac的包
第二步:在App_Start文件夹中添加一个AutofacConfig类
public class AutofacConfig
{
/// <summary>
/// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
/// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
/// </summary>
public static void Register()
{
//实例化一个autofac的创建容器
var builder = new ContainerBuilder();
//告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
Assembly controllerAss = Assembly.Load("AutoFacMvcDemo");
builder.RegisterControllers(controllerAss);
//如果有Dal层的话,注册Dal层的组件
//告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例
//Assembly dalAss = Assembly.Load("Dal");
//创建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));
}
}
第三步:在Global.asax调用AutofacConfig类中的Register方法,注册组件
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//注册组件
AutofacConfig.Register();
}
}
第四步:简单测试
homeController
private IUserService userService;
//通过构造器注入依赖
public HomeController(IUserService _userService)
{
userService = _userService;
}
public ActionResult Index()
{
//不使用autofac时,service层和mvc ui层强耦合
//UserInfoService userInfoService = new UserInfoService();
//List<UserInfo> users= userInfoService.GetUsers();
List<user> users = userService.GetUsers();
return View(users);
}
view
@{
ViewBag.Title = "Home Page";
}
<h2>用户列表</h2>
@* 简单展示用户 *@
@model IEnumerable<Model.user>
<table>
@foreach (var item in Model)
{
<tr>
<td>@item.USERID</td>
<td>@item.PASSWORD</td>
<td>@item.ID</td>
</tr>
}
</table>
这样配置完之后会有报错 “未找到具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序的实体框架提...
先把Model中配置文件中的连接字符串复制到mvc项目中的webconfig中,再增加entity framework和mysql data entity两个引用
做完之后就没问题了。参考网址:https://www.cnblogs.com/taadis/p/12126169.html
测试结果: