ASP.NET MVC三层框架并使用StructureMap实现扩展

在ASP.Net中StructureMap的是最老的IOC/DI工具,也就是依赖注入首先我们下载并引用StructureMap.dll

1。首先我们要创建一个接口和实现类我直接放在Models文件夹中。接口分别是IMemberRepository和IMessberrepository。

     实现接口的是MemberRepository和MessageRepository。

     2。既然使用了依赖注入,Controller的实例化当然不能再用系统本身的了,所以我们需要创建一个      StructureMapControllerFactory:DefaultControllerFactory

 

 public class StructureMapControllerFactory:DefaultControllerFactory
    {
        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            if (controllerType==null)
            {
                return null;
            } 
            try
            {
                return ObjectFactory.GetInstance(controllerType) as Controller;
            }
            catch (StructureMapException)
            {

                System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
                throw;
            }
        }
    }

 

3然后再注册接口实际使用的现实类。

public static class StructureMapBootstrapper
    {
        public static void Initialize()
        {
            ObjectFactory.Initialize(x => x.AddRegistry(new MyStructureMapApplicationRegistry()));
        }
        public static void SetControllerFactory()
        {
            var controllerFactory = new StructureMapControllerFactory();
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);
        }
    }

public   class MyStructureMapApplicationRegistry:Registry
    {
      /// <summary>
      /// 注册接口实际使用的现实类
      /// </summary>
      public MyStructureMapApplicationRegistry()
      {
          base.For<IMessageRepository>().Use<MessageRepository>();
          base.For<IMemberRepository>().Use<MemberRepository>();
      }
    }

 

 

4.在Application_Start()方法中也就是项目启动的时候注册StructureMap并通知系统使用我们自己的Controller Factory进行实例化Controller。

 

 protected void Application_Start()
        {
            StructureMapBootstrapper.SetControllerFactory();
            StructureMapBootstrapper.Initialize();
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

 

5在控制器中式构造函数

 public class MessageController : Controller
    {
        //
        // GET: /Message/
        IMessageRepository _messageReposity;
        IMemberRepository _memberRepository;
        public MessageController(IMessageRepository r, IMemberRepository m)
        {
            _messageReposity = r;
            _memberRepository = m;
        }
        //在留言板的主页面上使用分页,每两条数据为一页。
        public ActionResult Index(int? page)
        {
            var msgs = _messageReposity.FindAllMessage().ToPagedList(page.HasValue ? page.Value - 1 : 0, 2);
            return View(msgs);
        }

 

 

posted @ 2013-09-18 16:34  天羽星河落  阅读(399)  评论(0)    收藏  举报