1、常规写法,难道我们每次都new一个服务,如下面的UserService和CompanyService然后调用服务的Find方法去操作,为什么我们不让UserService和CompanyService服务注入进来呢? 

public ActionResult Index()
{
  DbContext context = new DbContext();
  IUserService userService = new UserService(context);
  User user = userService.Find<User>();

return View(user);
}
public ActionResult Index2()
{
  DbContext context = new DbContext();
  ICompanyService companyService = new CompanyService(context);   
Company company = companyService.Find<Company>(2);
   return View(company); 
}

2、我们想要的实际效果是MVC请求进来的时候,实例化控制器的时候,就把UserService和CompanyService服务注入进来,但是下面的带参数的控制器构造函数TestController(IUserService userService, ICompanyService companyService)MVC是实例化不了的,MVC只能实例化不带参数的构造函数TestController()

 public class TestController : Controller
{
private IUserService _iUserService = null;
private ICompanyService _iCompanyService = null;
/// <summary>
/// 构造函数注入---控制器得是由容器来实例化
/// </summary>
/// <param name="userService"></param>
/// <param name="companyService"></param>
public TestController(IUserService userService, ICompanyService companyService)
{
this._iUserService = userService;
this._iCompanyService = companyService;
}
}
public ActionResult Index()
{
  DbContext context = new DbContext();
  IUserService userService = this._iUserService;
  User user = userService.Find<User>();
return View(user);
}
public ActionResult Index2()
{
  DbContext context = new DbContext();
  ICompanyService companyService = this._iCompanyService;
Company company = companyService.Find<Company>();
   return View(company); 
}

 3、在“1、看源码MVC如何实例化控制器”中提到MVC实例化控制器使用的是ControllerBuilder.GetControllerFactory()得到一个DefaultControllerFactory工厂,然后用工厂的CreateController方法利用反射去创建Controller实例,那么我们可以把工厂换成自己实现的自定义工厂不就可以了吗,ControllerBuilder还有个SetControllerFactory方法,自定义的控制器工厂CustomControllerFactory继承DefaultControllerFactory,微软的特点是virtual和abstract都是让我们来扩展的,那么我们复写GetControllerInstance方法,在GetControllerInstance方法里去构建容器

public class CustomControllerFactory : DefaultControllerFactory
{
  protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
IUnityContainer container = DIFactory.GetContainer();
//return base.GetControllerInstance(requestContext, controllerType);
return (IController)container.Resolve(controllerType);
}
}

4、在Application_Start中指定自定义的控制器工厂

public class MvcApplication : System.Web.HttpApplication
{protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();//注册区域
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//注册全局的Filter
RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
BundleConfig.RegisterBundles(BundleTable.Bundles);//合并压缩 ,打包工具 Combres
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());//设置自定义的控制器工厂
}
}

5、依赖注入

public class DIFactory
{
public static IUnityContainer GetContainer()
{
IUnityContainer container = null;
//container.RegisterType
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, "MyContainer"); return container;
}
}

6、进行Unity配置

<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="MyContainer">
<extension type="Interception"/>
<register type="System.Data.Entity.DbContext, EntityFramework" mapTo="SchoolManager.EF.Model.SchoolDBEntities, SchoolManager.EF.Model"/>
<register type="SchoolManager.Bussiness.Interface.ICompanyService,SchoolManager.Bussiness.Interface" mapTo="SchoolManager.Bussiness.Service.CompanyService, SchoolManager.Bussiness.Service"/>
<register type="SchoolManager.Bussiness.Interface.IUserService,SchoolManager.Bussiness.Interface" mapTo="SchoolManager.Bussiness.Service.UserService, SchoolManager.Bussiness.Service"/>
</container>
</containers>
</unity>
</configuration>

最新文章

  1. Js dom操作总结
  2. Ubuntu&#39;s Trash
  3. React之JSX入门
  4. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
  5. mysql 聚集函数需要注意的问题
  6. api 翻译之AsyncTask
  7. [原]RobotFrameWork(十一)AutoItLibrary测试库在win7(64bit)下安装及简单使用
  8. Call Directory Extension 初探
  9. Powershell访问数组
  10. Oracle两张表关联批量更新其中一张表的数据
  11. 通俗的解释JAVA wait/notify机制
  12. 【linux之设备,分区,文件系统】
  13. Linux kernel的中断子系统之(一):综述
  14. Educational Codeforces Round 43 (Rated for Div. 2)
  15. python 函数,闭包
  16. kibana 启动 关闭 和进程查找
  17. Alpha、伪Beta 发布后,夏一鸣的个人感想与体会
  18. c# 合并重叠时间段的算法
  19. compiled inline cache
  20. 【spring mvc】基础概念

热门文章

  1. CSV数据存取
  2. Java数组深入
  3. springboot+logback日志输出企业实践(下)
  4. java中大整型BigInteger及setBit和testBit方法
  5. Netty网络框架
  6. SpringBoot使用拦截器、过滤器、监听器
  7. 【java】使用java.util的【Collections】简化List创建
  8. 2019-2020-1 20199304《Linux内核原理与分析》第一周作业
  9. ThinkPHP5——route(路由)的详解
  10. Apache ServiceComb 开源两周年,聊聊其与微服务的前世今生