今天主要来讲解使用Unity来自动注入。Unity前面我们已经详细的介绍过了,如有需要请自行前往去看,今天我们的重点是说MVC与IOC的结合。

IOC:控制反转,控制反转的工具是DI(依赖注入:构造函数注入--属性注入--方法注入(按时间顺序)),DI使用的工具是Unity容器。

一:新增mvc项目,然后nuget添加引用

   <package id="Unity" version="5.10.3" targetFramework="net45" />
<package id="Unity.Abstractions" version="4.1.3" targetFramework="net45" />
<package id="Unity.Configuration" version="5.10.0" targetFramework="net45" />
<package id="Unity.Container" version="5.10.3" targetFramework="net45" />
<package id="Unity.Interception" version="5.10.1" targetFramework="net45" />
<package id="Unity.Interception.Configuration" version="5.10.0" targetFramework="net45" />

二:新增文件夹CfgFiles新增一个unity.config文件,具体代码和注释如下:

 <configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity>
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
<containers>
<container name="ruanmouContainer">
<extension type="Interception"/>
<!--<register type="命名空间.接口类型2,程序集" mapTo="命名空间.实现类型2,程序集" />-->
<register type="System.Data.Entity.DbContext, EntityFramework" mapTo="Ruanmou.EF.Model.JDDbContext, Ruanmou.EF.Model"/> <register type="Ruanmou.Bussiness.Interface.IUserCompanyService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.UserCompanyService, Ruanmou.Bussiness.Service">
<interceptor type="InterfaceInterceptor"/>
</register> <register type="Ruanmou.Bussiness.Interface.IUserService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.UserService, Ruanmou.Bussiness.Service">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="Ruanmou.Project.AOP.LogBeforeBehavior, Ruanmou.MVC5"/>
<interceptionBehavior type="Ruanmou.Project.AOP.LogAfterBehavior, Ruanmou.MVC5"/>
</register> <register type="Ruanmou.Bussiness.Interface.ICompanyService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.CompanyService, Ruanmou.Bussiness.Service">
<interceptor type="InterfaceInterceptor"/>
</register>
</container>
</containers>
</unity>
</configuration>

需要注意的是:

1:一定在unity.config的属性中设置:复制到输出目录一定要设置:始终复制,这样做的目的是每次重新生成,会把这个untiy.config文件copy到bin目录下面。保证每次都是使用的是最新的。

2:下面这两个类是AOP拦截器需要的,如果需要的话则新增这些实体类,不需要的则直接删除掉。

<interceptionBehavior type="Ruanmou.Project.AOP.LogBeforeBehavior, Ruanmou.MVC5"/>
<interceptionBehavior type="Ruanmou.Project.AOP.LogAfterBehavior, Ruanmou.MVC5"/>

三:新增读取unity.config配置文件类DIFactory,代码如下:

  public class DIFactory
{
private static IUnityContainer container = null;
static DIFactory()
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
container = new UnityContainer();
section.Configure(container, "ruanmouContainer");
} public static IUnityContainer GetContainer()
{
return container;
}
}

四:新增defaultController类的子类DIControllerFactory来进行重新,具体代码如下:

 public class DIControllerFactory : DefaultControllerFactory
{
private Logger logger = new Logger(typeof(DIControllerFactory)); protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
this.logger.Warn($"{controllerType.Name}被构造..."); IUnityContainer container = DIFactory.GetContainer();
//return base.GetControllerInstance(requestContext, controllerType);
return (IController)container.Resolve(controllerType);
}
}

五:在Global.asax中指定控制器为当前新增的控制器DIControllerFactory,代码如下:

  public class MvcApplication : System.Web.HttpApplication
{
private Logger logger = new Logger(typeof(MvcApplication));
protected void Application_Start()
{ AreaRegistration.RegisterAllAreas();//注册区域
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//注册全局的Filter
RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
BundleConfig.RegisterBundles(BundleTable.Bundles);//合并压缩 ,打包工具 Combres ControllerBuilder.Current.SetControllerFactory(new DIControllerFactory()); this.logger.Info("网站启动了。。。");
}
}

六:上面的准备工作已经做好了,下面来测试使用:

   public class ThirdController : Controller
{
private IUserService _iUserService = null;
private ICompanyService _iCompanyService = null;
private IUserCompanyService _iUserCompanyService = null;
/// <summary>
/// 构造函数注入---控制器得是由容器来实例化
/// </summary>
/// <param name="userService"></param>
/// <param name="companyService"></param>
/// <param name="userCompanyService"></param>
public ThirdController(IUserService userService, ICompanyService companyService, IUserCompanyService userCompanyService)
{
this._iUserService = userService;
this._iCompanyService = companyService;
this._iUserCompanyService = userCompanyService; } // GET: Third
public ActionResult Index()
{
IUserService service = this._iUserService;
User user = service.Find<User>();
return View();
}
}

通过以上6个步骤则完成了IOC与MVC的完美结合,以后不用每次在new 一个业务类了。可以在初始化控制器的时候进行初始化那些业务类。

最新文章

  1. EaeyUI
  2. .net网站发布到局域网流程
  3. eclipse启动tomcat时设置端口
  4. cocos3.10 使用cocostudio 回调特性 c++版本说明
  5. poj 1259 Agri-Net(最小生成树)
  6. View转化为bitmap
  7. Merlin 的魔力: SpringLayout 管理器
  8. QLabel设置行间距(使用html的语法,比较巧妙)
  9. UVA 1426 - Discrete Square Roots(数论)
  10. Dynamics CRM 修改自定义实体名字及属性前缀(架构名称)
  11. Java反编译工具(Java Decompiler)
  12. pyquery 学习
  13. Log日志
  14. Appium-desktop安装启用Inspector一直报错An unknown server-side error occurred...
  15. Ambari安装常见问题
  16. 使用Windows 10专业版 进行VS2017开发 遇到 HTTP Error 400. The request hostname is invalid
  17. Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】
  18. 利用ansible进行自动化构建etcd集群
  19. C#使用LitJson对Json数据解析
  20. ThinkPHP - 6 - 学习笔记(2015.5.4)

热门文章

  1. zookeeper 链接报错 KeeperErrorCode = NodeExists for
  2. Jmeter接口测试,怎么在下一个接口调用上一个接口的数据
  3. STL map 简介
  4. [LeetCode] 141. Linked List Cycle 单链表中的环
  5. Jupyter Notebook 访问密码重置
  6. 【cf比赛记录】Codeforces Round #605 (Div. 3)
  7. Mysql遇到的问题总结
  8. Eclipse:设置自动补全,提高编程效率
  9. 安装Oracle 11g时遇到“【INS-13001】此环境不满足最低配置”的问题解决
  10. 如何备份开拓者TBQuant的策略文件