• c# MVC5(二) MVC与IOC结合


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

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

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

    1   <package id="Unity" version="5.10.3" targetFramework="net45" />
    2   <package id="Unity.Abstractions" version="4.1.3" targetFramework="net45" />
    3   <package id="Unity.Configuration" version="5.10.0" targetFramework="net45" />
    4   <package id="Unity.Container" version="5.10.3" targetFramework="net45" />
    5   <package id="Unity.Interception" version="5.10.1" targetFramework="net45" />
    6   <package id="Unity.Interception.Configuration" version="5.10.0" targetFramework="net45" />

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

     1 <configuration>
     2   <configSections>
     3     <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
     4   </configSections>
     5   <unity>
     6     <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
     7     <containers>
     8       <container name="ruanmouContainer">
     9         <extension type="Interception"/>
    10         <!--<register type="命名空间.接口类型2,程序集" mapTo="命名空间.实现类型2,程序集" />-->
    11         <register type="System.Data.Entity.DbContext, EntityFramework" mapTo="Ruanmou.EF.Model.JDDbContext, Ruanmou.EF.Model"/>
    12        
    13         <register type="Ruanmou.Bussiness.Interface.IUserCompanyService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.UserCompanyService, Ruanmou.Bussiness.Service">
    14           <interceptor type="InterfaceInterceptor"/>
    15         </register>
    16         
    17         <register type="Ruanmou.Bussiness.Interface.IUserService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.UserService, Ruanmou.Bussiness.Service">
    18           <interceptor type="InterfaceInterceptor"/>
    19           <interceptionBehavior type="Ruanmou.Project.AOP.LogBeforeBehavior, Ruanmou.MVC5"/>
    20           <interceptionBehavior type="Ruanmou.Project.AOP.LogAfterBehavior, Ruanmou.MVC5"/>
    21         </register>
    22         
    23         <register type="Ruanmou.Bussiness.Interface.ICompanyService,Ruanmou.Bussiness.Interface" mapTo="Ruanmou.Bussiness.Service.CompanyService, Ruanmou.Bussiness.Service">
    24           <interceptor type="InterfaceInterceptor"/>
    25         </register>
    26       </container>
    27     </containers>
    28   </unity>
    29 </configuration>
    View Code

    需要注意的是:

    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,代码如下:

     1  public class DIFactory
     2  {
     3      private static IUnityContainer container = null;
     4      static DIFactory()
     5      {
     6          ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
     7          fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\Unity.Config");
     8          Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
     9          UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
    10          container = new UnityContainer();
    11          section.Configure(container, "ruanmouContainer");
    12      }
    13 
    14      public static IUnityContainer GetContainer()
    15      {
    16          return container;
    17      }        
    18  }
    View Code

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

     1 public class DIControllerFactory : DefaultControllerFactory
     2 {
     3     private Logger logger = new Logger(typeof(DIControllerFactory));
     4 
     5     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
     6     {
     7         this.logger.Warn($"{controllerType.Name}被构造...");
     8 
     9         IUnityContainer container = DIFactory.GetContainer();
    10         //return base.GetControllerInstance(requestContext, controllerType);
    11         return (IController)container.Resolve(controllerType);
    12     }
    13 }
    View Code

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

     1  public class MvcApplication : System.Web.HttpApplication
     2  {
     3      private Logger logger = new Logger(typeof(MvcApplication));
     4      protected void Application_Start()
     5      {
     6 
     7          AreaRegistration.RegisterAllAreas();//注册区域
     8          FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//注册全局的Filter
     9          RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
    10          BundleConfig.RegisterBundles(BundleTable.Bundles);//合并压缩 ,打包工具 Combres
    11 
    12          ControllerBuilder.Current.SetControllerFactory(new DIControllerFactory());
    13 
    14          this.logger.Info("网站启动了。。。");
    15      }
    16  }
    View Code

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

     1   public class ThirdController : Controller
     2   {
     3       private IUserService _iUserService = null;
     4       private ICompanyService _iCompanyService = null;
     5       private IUserCompanyService _iUserCompanyService = null;
     6       /// <summary>
     7       /// 构造函数注入---控制器得是由容器来实例化
     8       /// </summary>
     9       /// <param name="userService"></param>
    10       /// <param name="companyService"></param>
    11       /// <param name="userCompanyService"></param>
    12       public ThirdController(IUserService userService, ICompanyService companyService, IUserCompanyService userCompanyService)
    13       {
    14           this._iUserService = userService;
    15           this._iCompanyService = companyService;
    16           this._iUserCompanyService = userCompanyService;
    17 
    18           
    19       }
    20 
    21 
    22       // GET: Third
    23       public ActionResult Index()
    24       {
    25           IUserService service = this._iUserService;
    26           User user = service.Find<User>(2);
    27           return View();
    28       }
    29   }
    View Code

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

  • 相关阅读:
    dp
    数学分析 + 容斥原理
    容斥
    并查集
    矩阵hash + KMP
    扫描线
    位运算
    2015 Multi-University Training Contest 5 1009 MZL's Border
    iOS ZipArchive文件解压缩
    iOS GCD倒计时
  • 原文地址:https://www.cnblogs.com/loverwangshan/p/11089910.html
Copyright © 2020-2023  润新知