为ASP.NET MVC创建一个基于Mini容器的ControllerFactory
2011-12-19 12:13
309 查看
背景
随着Asp.netmvc的越来越流行,关于和Mvc整合的DI容器也非常的多,而Mini容器一致没有把整合的方案发布出来,以至于不时的收到有些网友询问这些事,于是便有了该文。[解决方案
创建自定义工厂publicclassNLiteControllerFactory:DefaultControllerFactory { privateIServiceLocatorServiceLocator; publicNLiteControllerFactory(IServiceLocatorserviceLocator) { this.ServiceLocator=serviceLocator; } protectedoverrideIControllerGetControllerInstance(System.Web.Routing.RequestContextrequestContext,TypecontrollerType) { return(IController)ServiceLocator.Get(controllerType); } }
Demo例子
为了演示效果效果,用Artech兄的publicclassContact { publicstringName{get;set;} publicstringGender{get;set;} publicstringAddress{get;set;} } [Contract] publicinterfaceIContactRepository { IEnumerable<Contact>GetAllContacts(); } publicclassDefaultContactRepository:IContactRepository { publicIEnumerable<Contact>GetAllContacts() { yieldreturnnewContact { Name="ZhangSan", Gender="Male", Address="#328,XingHuStreet,SuZhou,JiangSuProvince,PRC." }; yieldreturnnewContact { Name="LiSi", Gender="Female", Address="#328,JinJiHuRoad,SuZhou,JiangSuProvince,PRC." }; } }
我们在Web应用的主页显示联系人列表,为此我创建了如下一个HomeController。在这里我们演示的是构造器注入,所以我们通过构造函数指定的IContactRepository对象来初始化Repository属性。在Action方法Index中调用IContactRepository的GetAllContacts方法为对应的View指定Model。
publicclassHomeController:Controller
{
publicIContactRepositoryRepository{get;privateset;}
publicHomeController(IContactRepositoryrepository)
{
this.Repository=repository;
}
publicActionResultIndex()
{
returnView(this.Repository.GetAllContacts());
}
}
在Global文件中注册Mvc的自定义控制器工厂
publicclassMvcApplication:System.Web.HttpApplication
{
publicstaticvoidRegisterGlobalFilters(GlobalFilterCollectionfilters)
{
filters.Add(newHandleErrorAttribute());
}
publicstaticvoidRegisterRoutes(RouteCollectionroutes)
{
routes.IgnoreRoute("favicon.ico");
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",//Routename
"{controller}/{action}/{id}",//URLwithparameters
new{controller="Home",action="Index",id=UrlParameter.Optional}//Parameterdefaults
);
}
protectedvoidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
//创建Mini容器
NLiteEnvironment.Refresh();
//设置组件的生命周期缺省是临时的
LifestyleType.Default=LifestyleFlags.Transient;
//注册联系人仓储组件
ServiceRegistry.Register<DefaultContactRepository>();
//设置自定义控制器工厂
ControllerBuilder.Current.SetControllerFactory(newNLiteControllerFactory(ServiceLocator.Current));
}
}
Index.cshtml代码如下所示,这是一个Model类型为IEnumerable<Contact>的View,它将所有的联系人信息列出来。
@modelIEnumerable<NLite.Mvc.Models.Contact>
@{
ViewBag.Title="Index";
}
<h2>ContactList</h2>
<div>
<ul>
@foreach(varcontactinthis.Model)
{
<li>
<h3>@contact.Name</h3>
<p>Gender:@contact.Gender</p>
<p>Address:@contact.Address</p>
<hr/>
</li>
}
</ul>
</div>
运行浏览器显示效果
相关文章推荐
- 为ASP.NET MVC创建一个基于Unity的ControllerFactory
- 在ASP.NET MVC 中,一个简单的例子让 URL 请求的 controller 和 action 小写
- 推荐一个基于Microsoft ASP.NET MVC Preview 2 的应用示例
- 【翻译】使用ASP.NET MVC 和 LINQ 创建一个Blog引擎实例-第一节
- 在15分钟内用ASP.Net MVC创建一个电影数据库应用程序
- Asp.Net MVC(创建一个任务列表应用程序) - Part.1
- ASP.NET MVC 2 学习篇(4)- 创建一个基本的MVC 项目
- 如何做一个基于ASP.NET MVC 网站(五)
- [翻译]15分钟内创建一个电影的ASP.NET MVC数据库应用程序
- 在Asp.Net MVC项目中创建一个API
- 创建一个基于ASP.NET 2.0的JSON WebService
- 教程一:用ASP.NET MVC创建一个TaskList应用程序
- 通过一个天气预报案例学习asp.net WebService(基于asp.net MVC)
- [翻译:ASP.NET MVC 教程]用ASP.NET MVC 创建一个电影数据库应用程序——补充
- 推荐一个基于Microsoft ASP.NET MVC Preview 2 的应用示例
- [转]使用 ASP.NET MVC 创建一个任务列表应用程序
- xamarian studio 创建asp.net mvc razor project 报错:Could not locate Razor Host Factory type: System.We
- .NET/ASP.NET MVC Controller 控制器(二:控制器的创建过程)
- Asp.Net MVC是否针对每次请求都重新创建一个控制器实例