最近学习了下 ASP.NET MVC,比较之前的 WebForm 没有了 IsPostBack 的判断,事件处理也被 Action 取代。MVC 中 WebForm中大量的事件处理中UI绑定,混杂的 js 注入, style 修改没有了;服务端控件不用了,结局是 View 被释放了,Controller可以被单元测试了,拿着 ViewModel 可以快速替换 View。(说句实话要不是有 Razor 这样的页面引擎加上 VS IDE 的强力智能感知,ASP.NET MVC 和 JSP 没有区别,说不定还会有人把 strust 标签,spring 标签拿来在 .NET 上封装一遍)
再加上现在的 EF,Model层以及DAL实现很自然的交给了 EF等ORM框架。加上现在的成熟的 Repository Pattern 和 UnitOfWork Pattern 实践上的Service分层也变成约定俗成。(关于 Repository 和 UnitOfWork 参看:Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application) 。分离出 Repository, UnitOfWork 就是避免在 Controller 里直接写入 Linq2Db 的代码,这样难以实现 Mockup,好比下面的代码:
(详细参考:Walkthrough: Using TDD with ASP.NET MVC)
【没有使用 Repository Pattern 的代码】
【使用 Repository Pattern 的代码】
测试可以用个 Mock Repository,_db 数据从哪来就自由了...
而 Controller 变成这样:
其实上面的都是引子,用 Unity 目的是进一步推迟 Repository 或者 UnitOfWork (很多时候演变成 Service 了) 的实例化时机,交给了 IoC 容器注入。以达到更灵活切换的目的,比如从 MS Entities 变换到 MySql Entities 或者是从 ObjectContext 变换到 DbContext (CodeFirst)。
下面介绍一下 Unity.MVC3 的实践过程:
1. EF CodeFirst Models
用 EF CodeFirst 创建一个 Models 工程,用来管理 Entities
表很简单,只有一个 DbSet<User>
2. GenericRepository
主要针对 EF(ObjectContext) 和 EF CodeFirst(DbContext) 抽出接口 IRepository
DbContextRepository<T> 对应于 DbContext 的 IRepository<T> 实现,通过构造方法注入 Context 实例
3. MVC Web 应用
(1) 先通过 NuGet 获取 Unity.MVC3
ASP.NET MVC3 中开放了依赖注入容器的接口IDependencyResolver,ASP.NET Controller 被调用时,会利用该接口进行依赖注入。因此可以利用这个接口,
使用任何的依赖注入容器。另外,Unity.MVC3.dll在UnityContainerExtensions 类里扩展了RegisterControllers 方法,
它将为当前 Assembly 所有非 abstract Controller 完成注册(来自 IControllerFactory 的依赖 )
添加完毕,会发现在 Web 工程下多出Bootstrapper.cs 文件
这里我把依赖关系都放到配置文件里了:
然后在 Global.asax.cs 里调用 Bootstrapper.Initialise(); 即可。
另外,需要注意的是<register type="IRepository[User]" mapTo="DbContextRepository[User]"> 里加上了<lifetime type="HierarchicalLifetimeManager" />
这样在 Controller 生命周期结束时才会调用 Dispose。(待展开)
再来看看 Controller 的实现:
根据上面的配置文件:<register type="IRepository[User]" mapTo="DbContextRepository[User]">
[Dependency] 标识的 UserRepository 会在 Controller 请求时被注入实例。
运行:
利用了 IoC 整个系统结构,好比如下图:
分享到:
相关推荐
使用Unity.MVC3在asp.net mvc3中实现依赖注入 有具体使用步骤
参考https://www.cnblogs.com/ymnets/p/3424943.html 做的示例程序,自己的理解地址https://blog.csdn.net/xunbaogang/article/details/82148711
ibatis.net的asp.net MVC的实例,集成了Microsoft.unity的IOC
ASP.NET MVC4中使用Unity Ioc Container 实例
ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统
1. ASP.NET MVC 基础 为什么选择MVC,假如您是个有梦想的人,那么你也应该喜欢极致的东西,而不顾一切付出 表现层的性能可以优化到极致 强迫学习前端语言html以及css、JavaScript 关注点分离 原生态url routing,...
自己学习是写的关于ASP.NET MVC3 EF4.1 Unity的组合实例,使用EF4.1 Codefirst模式,数据库自己会自动生成,代码很简单,分层也很简单,对于初学者可能有点帮助。。。
Basic Customer CRUD Use Case with MVC Scafolding Template w/ Async Refactoring the CustomerController to use UoW & Repo Framework w/ Async Why the ICustomerService Approach? Why Commit Unit of Work ...
ASP.NET Mvc + NHibernate + Unity Application Block 示例程序
来自51ASpXA library that allows simple Integration of Microsoft's Unity IoC container with ASP.NET MVC 3. This project includes a bespoke DependencyResolver that creates a child container per ...
主要给大家介绍了关于ASP.NET MVC如何使用Unity实现Ioc的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
ASP.NET MVC5 六层框架+Bootstrap+Unity依赖注入。
主要使用ASP.NET MVC 5 &Unity; & Entity Framework 6,有较强的可撸性。是论坛开发者的不二之选。 官方地址:http://www.mvcforum.com/ 支持多国语言 支持多种数据库,开盖即饮(因为EF支持),无需安装。 积分 ...
一个基于.NET的N层开发框架,用到了ASP.NET MVC3,Razor,EF4.1,Unity
C# + SQL Server 本系统包括两类用户:学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息;开设课程、查询课程、录入成绩、统计成绩 管理系统是一种通过计算机技术...
01 基础加强六天 02 数据库四天 03 和ADO三天 04 JavaScript 05 DOM 06 JQuery 07 .NET就业班-三层项目+SVN五天 08 ASP.NET十一天 09 ASP.NET十一天 10 2015-06-17 EF 11 MVC两天 12 OA项目九天 13 7月9号就业培训 ...
开始,我们有了一系列的解决方案,我们将动手搭建新系统吧。 用户的体验已经需要...MVC4将挂载在.NET Framework4.5上。 好! 打开我们熟悉的VS创建一个空解决方案。我起了个名字叫AppSolution,类库命名空间将与Ap
自己整理的.NET随身笔记,包含C#基础,面向对象,sql,ADO.NET,XML,LINQ,HTML,Javascript,jquery,ASP.NET,MVC,WEB SERVICE,WCF,Unity3D,SVN,设计模式等等。
该项目将会用到许多微软的最新开发技术,如ASP.NET MVC、Silverlight、LINQ、WCF、Unity、Managed Extensibility Framework等,你可以用它来与朋友联系、共享创意、组织活动、分享照片,同时,我们致力于提供一套极...