• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

为ASP.NET MVC创建一个基于Unity的ControllerFactory

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

谈到IoC和ASP.NET的集成,很多人会先后想到Ninject,不过我们个人还是倾向于Unity。这篇文章简单地介绍如果创建基于Unity的ControllerFactory。如下面的代码所示,我们通过直接继承DefaultControllerFactory创建一个自定的UnityControllerFactory。构造函数指定的是配置的UnityContainer的名称,如果没有显式指定则采用默认的UnityContainer。在重写的GetControllerInstance方法中,直接调用IUnityContainer的Resolve方法根据Controller类型创建相应的对象。[源代码从这里下载]

class UnityControllerFactory: DefaultControllerFactory
   2: {
private set; }
)
   5:     {
new UnityContainer();
as UnityConfigurationSection;
string.IsNullOrEmpty(containerName))
   9:         {
);
  11:         }
  12:  
string.IsNullOrEmpty(containerName))
  14:         {
  15:             configSection.Configure(container);
  16:         }
else
  18:         {
  19:             configSection.Configure(container, containerName);
  20:         }
this.Container = container;
  22:     }
override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
  24:     {
);
this.Container.Resolve(controllerType);
  27:     }
  28: }

为了演示DefaultControllerFactory的作用,我们来创建一个简单的例子。假设我们要创建一个维护联系人的应用,我们通过具有如下定义的Contact类型表示联系人,而IContactRepository接口定义了一个从存储中获取所有联系人的GetAllContacts方法,DefaultContactRepository是对IContactRepository接口的实现。

class Contact
   2: {
string Name { get; set; }
string Gender { get; set; }
string Address { get; set; }
   6: }
   7:  
interface IContactRepository
   9: {
  10:     IEnumerable<Contact> GetAllContacts();
  11: }
  12:  
class DefaultContactRepository : IContactRepository
  14: {
public IEnumerable<Contact> GetAllContacts()
  16:     {
new Contact
  18:         {
,
,
  22:         };
  23:  
new Contact
  25:         {
,
,
  29:         };
  30:     }
  31: }

我们在Web应用的主页显示联系人列表,为此我创建了如下一个HomeController。在这里我们演示的是构造器注入,所以我们通过构造函数指定的IContactRepository对象来初始化Repository属性。在Action方法Index中调用IContactRepository的GetAllContacts方法为对应的View指定Model。

class HomeController : Controller
   2: {
private set; }
public HomeController(IContactRepository repository)
   5:     {
this.Repository = repository;
   7:     }
public ActionResult Index()
   9:     {
this.Repository.GetAllContacts());
  11:     }
  12: }

Index.cshtml代码如下所示,这是一个Model类型为IEnumerable<Contact>的View,它将所有的联系人信息列出来。

>
   2: @{



    
   4: }
   5:  
>
   7:  
>
>
  10: @foreach (var contact in this.Model)
  11: { 
>
>
>
>
/>
>
  18: }
>
>

自定义的UnityContainerFactory的注册定义在Gloable.asax中。初次之外,额外需要做的是忽略掉针对favicon.ico的路由,否则程序运行将会失败。

class MvcApplication : System.Web.HttpApplication
   2: {
void RegisterGlobalFilters(GlobalFilterCollection filters)
   4:     {
new HandleErrorAttribute());
   6:     }
   7:  
void RegisterRoutes(RouteCollection routes)
   9:     {
);
);
,
, id = UrlParameter.Optional } 
  14:         );
  15:     }
  16:  
void Application_Start()
  18:     {
  19:         AreaRegistration.RegisterAllAreas();
  20:         RegisterGlobalFilters(GlobalFilters.Filters);
  21:         RegisterRoutes(RouteTable.Routes);
  22:  
new UnityControllerFactory());
  24:     }
  25: }

接口IContactRepository和DefualtContactRepository之间的映射关系定义在如下所示的<unity>配置中。

>
/>
/>
>
/>
>
>

通过浏览器访问Web应用的主页,将会得到如下所示的联系人列表。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net 返回上一页的实现方法小集发布时间:2022-07-10
下一篇:
ASP.NET开源框架之HIPPO技术内幕(六)--后台管理与前台展示发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap