您的位置:首页 > 编程语言 > ASP

为ASP.NET MVC创建一个基于Mini容器的ControllerFactory

2011-12-19 12:13 309 查看

背景

随着Asp.netmvc的越来越流行,关于和Mvc整合的DI容器也非常的多,而Mini容器一致没有把整合的方案发布出来,以至于不时的收到有些网友询问这些事,于是便有了该文。[源代码从这里下载,Mini容器官方地址]

解决方案

创建自定义工厂

publicclassNLiteControllerFactory:DefaultControllerFactory
{
privateIServiceLocatorServiceLocator;
publicNLiteControllerFactory(IServiceLocatorserviceLocator)
{
this.ServiceLocator=serviceLocator;
}

protectedoverrideIControllerGetControllerInstance(System.Web.Routing.RequestContextrequestContext,TypecontrollerType)
{
return(IController)ServiceLocator.Get(controllerType);
}
}


Demo例子

为了演示效果效果,用Artech兄的为ASP.NETMVC创建一个基于Unity的ControllerFactory这篇博客的例子了.要创建一个维护联系人的应用,我们通过具有如下定义的Contact类型表示联系人,而IContactRepository接口定义了一个从存储中获取所有联系人的GetAllContacts方法,DefaultContactRepository是对IContactRepository接口的实现

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>


运行浏览器显示效果


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: