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); }

浙公网安备 33010602011771号