StructureMap使用方法(转)
终于到了题目中的MVC使用StructureMap依赖注入的配置与实现了。在ASP.Net三层架构应用中StructureMap的是最老的IOC/DI工具,也就是依赖注入,很多线上的项目都使用了StructureMap,非常酷的是他是免费的,具体的IOC/DI的设计思想本篇文章不做介绍,想研究可以百度一下,资料很多,哎说道百度想起google一堆泪啊,自从google撤出中国,google是经常的无法访问,很无奈啊很无奈。
依赖注入主要有两种方式:一种是Setter and Getter,一种是构造函数方式。天屹的这套框架使用的后者Constructor构造器的方式。如果你看了前面的文章,就会发现每个Service和Controller中都会有一个构造方法,没错我们就是使用的它们,接下详细的介绍一下StructureMap是怎么在我们的项目中实现依赖注入的。

一.配置与注册Services和Repositories
首先我们告诉StructureMap,我们需要注入的是什么,本系统中需要注册的是Services和Repositories,分别注入到Controller和Service。下面是具体写法,为什么这么写,不必较真,写法是StructureMap提供给我们的,使用就好了。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using StructureMap;
- namespace TYStudioDemo.StructureMap
- {
- public class BootStrapper
- {
- public static void ConfigureStructureMap()
- {
- ObjectFactory.Configure(x =>
- {
- x.AddRegistry(new TYStudioDemoStructureMapRegistry());
- x.Scan(scanner =>
- {
- scanner.Assembly("TYStudioDemo.Services");
- scanner.Assembly("TYStudioDemo.Repositories");
- });
- });
- }
- }
- }
上面的代码告诉了StructureMap去哪里找我们的Service和Repositories。同时TYStudioDemoStructureMapRegistry这个类告诉了StructureMap该用哪个类去实例化我们的接口,下面是TYStudioDemoStructureMapRegistry的代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using StructureMap.Configuration.DSL;
- using TYStudioDemo.Models;
- using TYStudioDemo.DTO;
- using TYStudioDemo.Interfaces;
- using TYStudioDemo.Services;
- using TYStudioDemo.Repositories;
- namespace TYStudioDemo.StructureMap
- {
- public class TYStudioDemoStructureMapRegistry : Registry
- {
- //注册接口实际使用的实现类
- public TYStudioDemoStructureMapRegistry()
- {
- SelectConstructor<TYEntities>(() => new TYEntities());
- //Exception Handle
- For<ITYExceptionService>().Use<TYExceptionService>();
- //Services
- For(typeof(ISupplierService)).Use(typeof(SupplierService));
- //Repositories
- For(typeof(ISupplierRepository<>)).Use(typeof(SupplierRepository));
- For(typeof(IProductRepository<>)).Use(typeof(ProductRepository));
- }
- }
- }
现在我们已经配置了StructureMap并且注册了Service和Repository,接下来该告诉系统去使用StructureMap去实例化我们的Controller。
二.创建Controller Factory
既然使用了依赖注入,Controller的实例化当然不能再用系统本身的了,所以我们需要创建一个ControllerFactory:TYStudioDemoStructureMapControllerFactory。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Web.Mvc;
- using StructureMap;
- namespace TYStudioDemo.StructureMap
- {
- public class TYStudioDemoStructureMapControllerFactory : DefaultControllerFactory
- {
- protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType)
- {
- if (controllerType != null)
- {
- Controller c = ObjectFactory.GetInstance(controllerType) as Controller;
- //当返回一个错误页面,View一级异常会被触发
- c.ActionInvoker = new ErrorHandlingActionInvoker(new HandleErrorAttribute());
- return c;
- }
- else
- return null;
- }
- }
- }
TYStudioDemoStructureMapControllerFactory继承自DefaultControllerFactory,DefaultControllerFactory是MVC默认的Controller Factory,然后重新器获得Controller实例的方法,由StructureMap的ObjectFactory来创建实例,StructureMap会帮我们把Controller构造函数中的参数实例化。
上面的ErrorHandlingActionInvoker方法:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Web.Mvc;
- namespace TYStudioDemo.StructureMap
- {
- public class ErrorHandlingActionInvoker : ControllerActionInvoker
- {
- private readonly IExceptionFilter filter;
- public ErrorHandlingActionInvoker(IExceptionFilter filter)
- {
- if (filter == null)
- throw new ArgumentNullException("Exception filter is missing");
- this.filter = filter;
- }
- protected override FilterInfo GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
- {
- var filterInfo = base.GetFilters(controllerContext, actionDescriptor);
- filterInfo.ExceptionFilters.Add(this.filter);
- return filterInfo;
- }
- }
- }
Controller Factory创建ok。但是这样系统是不会使用我们自己的Controller Factory的,所以需要通知一下MVC系统。
三.配置Global.asax文件
在Application_Start()方法中也就是项目启动的时候注册StructureMap并通知系统使用我们自己的Controller Factory进行实例化Controller。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Http;
- using System.Web.Mvc;
- using System.Web.Optimization;
- using System.Web.Routing;
- using TYStudioDemo.StructureMap;
- namespace TYStudioDemo.WebUI
- {
- // Note: For instructions on enabling IIS6 or IIS7 classic mode,
- // visit http://go.microsoft.com/?LinkId=9394801
- public class MvcApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- WebApiConfig.Register(GlobalConfiguration.Configuration);
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- BundleConfig.RegisterBundles(BundleTable.Bundles);
- AuthConfig.RegisterAuth();
- //注册StructureMap
- BootStrapper.ConfigureStructureMap();
- //通过StructureMap返回Controller实例,通过构造器注入
- ControllerBuilder.Current.SetControllerFactory(new TYStudioDemoStructureMapControllerFactory());
- }
- protected void Application_EndRequest(object sender, EventArgs e)
- {
- TYStudioDemo.Models.TYEntities.Cleanup();
- }
- }
- }
ok,到此StructureMap的配置就全部完成了,接下来我们该怎么使用它呢。
文章开头已经告诉大家了我们使用Constructor构造器的方式进行依赖注入。
四.Controller的写法
既然是构造器就要写构造函数了,见下面写法:
- ISupplierService _supplierService;
- public SupplierController(ITYExceptionService tyExceptionService,
- ISupplierService supplierService)
- {
- _tyExceptionService = tyExceptionService;
- _supplierService = supplierService;
- }
在构造方法中加入我们要注入的Service接口,然后StructureMap就会根据上面TYStudioDemoStructureMapRegistry的配置去创建我们需要实例化的service对象了。
同样向Service中注入Repository的写法是一样的:
- ISupplierRepository<Supplier> _supplierRepository;
- IProductRepository<Product> _productRepository;
- public SupplierService(ISupplierRepository<Supplier> supplierRepotitory,
- IProductRepository<Product> productRepository)
- {
- _supplierRepository = supplierRepotitory;
- _productRepository = productRepository;
- }
至此StructureMap配置与使用就全部完成了。
总结:
我们发现,我们的参数都是接口类型了,这样的好处就是将来对ISupplierService的实现不一样了,我们只需要重写写一个ISupplierService的实现了,并修改TYStudioDemoStructureMapRegistry使ISupplierService使用新的实现类,就可以了。因为我们使用的都是接口所以方法和参数都是固定的,所以呢~~ Controller中不用修改任何代码,同理Service也是一样的。这样就充分的降低了代码之间的耦合度。
下篇文章将介绍使用Enterprise Library 5.0 实现异常与日志的处理。
转自:http://www.tystudio.net/2013/04/06/mvc-structuremap-config/
StructureMap使用方法(转)的更多相关文章
- CSS、HTML5、JS
[att*=value]{}包含value属性的所有元素样式.[id*=div]{} a[href$=jpg]:after{} [att^=value]{}开头字符包含value属性的所有元素样式 [ ...
- 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统
用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- .Net中的AOP系列之《间接调用——拦截方法》
返回<.Net中的AOP>系列学习总目录 本篇目录 方法拦截 PostSharp方法拦截 Castle DynamicProxy方法拦截 现实案例--数据事务 现实案例--线程 .Net线 ...
- StructureMap 代码分析之Widget 之Registry 分析 (1)
说句实话,本人基本上没用过Structuremap,但是这次居然开始看源码了,不得不为自己点个赞.Structuremap有很多的类,其中有一个叫做Widget的概念.那么什么是Widget呢?要明白 ...
- StructureMap 学习笔记(1)
前言 一个偶然的机会接触到了StructureMap,当时客户要求让程序具有较好的测试性,自然而然就想到了IOC 容器. 之后就去Google了一下, 不经意间在StackOverFlow找到一篇帖子 ...
- StructureMap依赖注入
IOC:控制反转,是一种设计模式.一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制:第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系.他们的依赖关系 ...
- DI 依赖注入之StructureMap框架
DI 依赖注入之StructureMap框架 一.简叙: structureMap只是DI框架中的其中之一. 二.安装及使用: 1.懒人方法: 使用MVC5项目时,可以直接在nuget程序包中安装S ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
随机推荐
- uva 1382 - Distant Galaxy
题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91208#problem/G 题意: 给出平面上的n个点,找出一个矩形,使得边 ...
- 内置函数----整理、例题 、xmin
-----------数值函数 ---绝对值 select abs(-123) from dual; --求模 select mod (12,5) from dual; --取整 --上限值 sele ...
- android-BaseAdapter自定义控件深刻理解
一.自定义控件的实现 自定义控件需要继承BaseAdapter抽象类,该类实现了ListAdapter, SpinnerAdapter两个接口,这两个接口继承了Adapter接口类,没错.是继承Ada ...
- Linux_文件打包,压缩,解压
一.压缩命令 文件格式:*.gz 命令:gzip 文件名 (ps:不能压缩目录,切压缩后不保留原文件) 压缩前 -rw-r--r--. 1 root root 315 Sep 6 21:03 df.t ...
- Aidl的使用步骤
先说说Aidl传递参数类型 1.基本数据类型(除short类型) 2.String.charSequence 3.List,map 4.parcelable 第1步:定义一个*.aidl文件,ecli ...
- css问题 ie7兼容性问题
1.响应式网站用百分比时ie7不兼容:试试将margin:0 10% 改为margin-left:15%; 左边是可以的,但是右边就不行了 2.ie7的span 里的字会出现白色背景 ,是因为没有定高 ...
- 理解group by 语句的扩展使用
在SQL的开发中我们会经常使用group by语句对数据进行分组统计,然而在一些复杂的BI报表开发中会常遇到更复杂的分组需求,单单使用group by 就不能解决我们的问题了,这时我们就需要学习了解一 ...
- java 通过控制台输入的数字打印菱形字母
package com.rui.test; import java.util.Scanner; /** * @author sunshine * @version 1.0 * @date:2015年1 ...
- maven工程打包出现Test相关的错误
----------------------------------------------------- T E S T S ------------------------------------ ...
- NLP文本情感分类传统模型+深度学习(demo)
文本情感分类: 文本情感分类(一):传统模型 摘自:http://spaces.ac.cn/index.php/archives/3360/ 测试句子:工信处女干事每月经过下属科室都要亲口交代24口交 ...