【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可。
一、测试仓储层、业务层是否能实现对数据库表的操作
1、在52MVCBlog.IRepository程序集下创建IsysUserInfoRepository接口来继承IBaseRepository父接口
IsysUserInfoRepository接口代码:
using _52MVCBlog.IRepository.Base; using _52MVCBlog.Model.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _52MVCBlog.IRepository { public partial interface IsysUserInfoRepository : IBaseRepository<sysUserInfo> { } }
2、在52MVCBlog.Repository程序集下创建sysUserInfoRepository类继承BaseRepository父类,以及 IsysUserInfoRepository接口
sysUserInfoRepository代码:
using _52MVCBlog.IRepository; using _52MVCBlog.Model.Models; using _52MVCBlog.Repository.Base; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _52MVCBlog.Repository { public partial class sysUserInfoRepository : BaseRepository<sysUserInfo>, IsysUserInfoRepository { } }
3、在52MVCBlog.IService程序集下创建服务接口IsysUserInfoServices继承IBaseServices接口
IsysUserInfoServices接口代码:
using _52MVCBlog.IService.Base; using _52MVCBlog.Model.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _52MVCBlog.IService { public partial interface IsysUserInfoServices : IBaseServices<sysUserInfo> { } }
4、在52MVCBlog.Service程序集下创建服务类sysUserInfoServices继承BaseServices,以及IsysUserInfoServices接口
sysUserInfoServices代码:
using _52MVCBlog.IService; using _52MVCBlog.Model.Models; using _52MVCBlog.Service.Base; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _52MVCBlog.Service { public partial class sysUserInfoServices : BaseServices<sysUserInfo>, IsysUserInfoServices { } }
5、服务层的父类BaseServices中baseDal需要new一个仓储父类泛型
public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();
6、在UI层中MVC,添加HOME控制器并index下创建一个添加的实例
using _52MVCBlog.IService; using _52MVCBlog.Model.Models; using _52MVCBlog.Service; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace _52MVCBlog.WebUI.Controllers { public class HomeController : Controller { IsysUserInfoServices userInfoServices = new sysUserInfoServices(); // // GET: /Home/ public ActionResult Index() { try { for (int i = 0; i < 10; i++) { userInfoServices.Add(new sysUserInfo() { uLoginName = "admin" + i, uLoginPWD = "123456", uRealName = "超级管理员" + i, uCreateTime = DateTime.Now, uUpdateTime = DateTime.Now, uRemark = "测试添加功能" }); } userInfoServices.SaverChanges(); return Content("添加数据成功"); } catch (Exception ex) { return Content("错误提示:" + ex.Message); } } } }
7、在WebUI的Web.config中添加数据库链接字符串(将52MVCBlog.Model程序集下面的AppConfig文件中的数据拷过来,并修改连接字符串,同时在Lib文件中引用EntityFramework.dll、EntityFramework.SqlServer)
配置如下:
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add name="52MVCBlogDB" connectionString="server=WYT\SQL2008R2;uid=sa;pwd=123456;database=52MVCBlogDB" providerName="System.Data.SqlClient" /> </connectionStrings> <appSettings> <add key="webpages:Version" value="3.0.0.0"/> <add key="webpages:Enabled" value="false"/> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> </system.web> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
8、然后启动系统页面提示(启动后会自动创建数据库)
表示数据能够正常录入数据库中,查看数据库
数据库中数据已经可以正常插入,另外对表中的字段约束也成功了。
二、使用Autofac依赖注入分离接口与实例之间的关系,达到解耦的目的
详细使用参照:AutoFac (控制反转IOC 与依赖注入DI)
1、使用NuGet管理工具下载Autofac与Autofac.MVC5,安装在webUI
2、然后在App_Start文件中创建AutofacConfig.cs文件
AutofacConfig代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Autofac; using Autofac.Integration.Mvc; using System.Reflection; using System.Web.Mvc; namespace _52MVCBlog.WebUI.App_Start { public class AutofacConfig { /// <summary> /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建 /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作 /// 将MVC默认的控制器工厂替换成AutoFac的工厂 /// </summary> public static void Register() { //第一步: 构造一个AutoFac的builder容器 //1.1实例化一个autofac的创建容器 ContainerBuilder builder = new ContainerBuilder(); //第二步:告诉AutoFac控制器工厂,控制器类的创建去哪些程序集中查找(默认控制器工厂是去扫描bin目录下的所有程序集) //2.1 从当前运行的bin目录下加载52MVCBlog.WebUI程序集 Assembly controllerAss = Assembly.Load("52MVCBlog.WebUI"); //2.2 告诉AutoFac控制器工厂,控制器的创建从controllerAss中查找 //将MVC默认的控制器工厂替换成AutoFac的工厂 //using Autofac.Integration.Mvc; builder.RegisterControllers(controllerAss); //第三步:告诉AutoFac容器,创建项目中的指定类的对象实例,以接口的形式存储(其实就是创建数据仓储层与业务逻辑层这两个程序集中所有类的对象实例,然后以其接口的形式保存到AutoFac容器内存中,当然如果有需要也可以创建其他程序集的所有类的对象实例,这个只需要我们指定就可以了) //3.1 加载数据仓储层52MVCBlog.Repository这个程序集。 Assembly respAss = Assembly.Load("52MVCBlog.Repository"); //3.2 反射扫描这个52MVCBlog.Repository.dll程序集中所有的类,到这个程序集中所有类的集合。 Type[] rtypes= respAss.GetTypes(); //3.3 告诉AutoFac容器,创建rtypes这个集合中所有类的对象实例,以其接口的形式保存 builder.RegisterTypes(rtypes).AsImplementedInterfaces(); //3.4 加载业务逻辑层52MVCBlog.Service这个程序集。 Assembly serpAss = Assembly.Load("52MVCBlog.Service"); //3.5 创建serAss中的所有类的instance以此类的实现接口存储 builder.RegisterTypes(serpAss.GetTypes()).AsImplementedInterfaces(); //第四步:创建一个真正的AutoFac的工作容器 var container = builder.Build(); //第五步:将当前容器中的控制器工厂替换掉MVC默认的控制器工厂。//using System.Web.Mvc; DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } } }
3、由于需要在系统启动之前来把所有的类创建好相应的对象
需要在Global文件下添加一个配置文件来实现MVC项目的IOC和DI
4、修改Repository程序集和Services程序集的生成路基到WebUI层的Bin目录下,也可以直接引用的方式。(这里不建议修改,还是引用的方便点,不然后期维护不好维护)
5、修改HomeController控制器下userinfoservice的生成方式,改为创建构造函数的时候来生成。
6、修改服务层sysUserInfoServices构造函数,使其创建的时候生成相应的对象因为sysUserInfoServices继承BaseServices,而BaseServices也可以使用构造函数生成
把dal复制给dal是为了能拿到sysUserInfoServices中自己特殊的方法。base.baseDal = dal;为拿到父类的公用方法。
BaseServices类中也修改为不需要new一个实例类
7、把homeController下改成查询数据,返回到页面。
8、BUG解决
解决方案:52MVCBlog.WebUI添加52MVCBlog.Repository的引用
9、运行效果
~不知不觉到凌晨1点了,明天继续加油~
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!