加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:04:23 所属栏目:asp.Net 来源:网络整理
导读:谈到IoC和ASP.NET的集成,很多人会先后想到Ninject,不过我们个人还是倾向于Unity。这篇文章简单地介绍如果创建基于Unity的ControllerFactory。如下面的代码所示,我们通过直接继承DefaultControllerFactory创建一个自定的UnityControllerFactory。构造函数

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

   1: public class UnityControllerFactory: DefaultControllerFactory
   3:     public IUnityContainer Container { get; private set; }
   5:     {
   7:         UnityConfigurationSection configSection = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
   9:         {
  11:         }
  13:         string.IsNullOrEmpty(containerName))
  15:             configSection.Configure(container);
  17:         else
  19:             configSection.Configure(container,containerName);
  21:         this.Container = container;
  23:     protected override IController GetControllerInstance(RequestContext requestContext,Type controllerType)
  25:         Guard.ArgumentNotNull(controllerType,"controllerType");
  27:     }
    
string Name { get; set; }
   5:     string Address { get; set; }
   7:? 
   9: {
  11: }
  14: {
  16:     {
  19:             Name = "Zhang San",
  21:             Address = "#328,XingHu Street,Su Zhou,Jiang Su Province,PRC."
  23:? 
  25:         {
  29:         };
  31: }

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

public IContactRepository Repository { get; public HomeController(IContactRepository repository)
   7:     }
   9:     {
  11:     }
   1: @model IEnumerable<Artech.Web.Mvc.Extensions.Contact>
   3:     ViewBag.Title = "Index";
   5:? 
div   9: ul  10: @foreach (var contact in this.Model)
  12:     lih3>@contact.Name  14:         p>Gender: @contact.Gender  15:         >Address: @contact.Address  16:         hr />
  19:   20: >

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

static void RegisterGlobalFilters(GlobalFilterCollection filters)
   5:         filters.Add(new HandleErrorAttribute());
void RegisterRoutes(RouteCollection routes)
  11:         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  14:         );
  16:? 
  18:     {
  20:         RegisterGlobalFilters(GlobalFilters.Filters);
  22:? 
  24:     }
unity   2:   alias alias="IContactRepository" type="Artech.Web.Mvc.Extensions.IContactRepository,UnityIntegration"    3:   ="DefaultContactRepository" ="Artech.Web.Mvc.Extensions.DefaultContactRepository,1)">/>