SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示
SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示
1,与MVC集成
见http://simpleinjector.codeplex.com/wikipage?title=Integration%20Guide&referringTitle=Home
我们自己建个MVC4项目测试
1.1 nuget
只需要安装Mvc的集成即可,其它的依赖会自动安装:
Install-Package SimpleInjector.Integration.Web.Mvc
1.2 Global.asax:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //按如下步骤添加 // 1. Create a new Simple Injector container var container = new Container(); // 2. Configure the container (register) //container.Register<IUserService, UserService>(Lifestyle.Transient); //container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Singleton); //随便写个例子测试,名字就不计较了,Lifestyle的区别自行查文档 container.Register<Iaaa, aaa>(Lifestyle.Transient); // 3. Optionally verify the container's configuration. container.Verify(); // 4. Store the container for use by Page classes. //WebApiApplication.Container = container; System.Web.Mvc.DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); // 5. register global filters //如果有注册全局过滤器的需要加此节点,和下面注释掉的方法 //RegisterGlobalFilters(GlobalFilters.Filters, container); } //public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container) //{ //} } |
1.3 测试接口和方法的实现
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public interface Iaaa{ int a { get; set; } string hello(string str);}public class aaa : Iaaa{ public aaa() { a = DateTime.Now.Millisecond; } public int a { get; set; } public string hello(string str) { return "hello " + str + " timestamp: " + a; }} |
1.4 到一个controller里面测试
注意私有变量,和构造函数的使用即可。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class testController : Controller{ private Iaaa _srv; public testController(Iaaa srv) { _srv = srv; } public string Index(string id) { return _srv.hello(id); }} |
访问/test/myname 正确输出"hello myname timestamp 234"
其实跟官网的一模一样:http://simpleinjector.codeplex.com/
2,与WebApi集成
http://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration&referringTitle=Integration%20Guide
在同一个项目里测试就行了,更好演示与mvc和与web api集成的区别,所以也不需要新建项目,及添加引用了
2.1 新建一个webapi的控制器tst
基本上是复制test控制器的代码,很简单:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public class tstController : ApiController{ private Iaaa _srv; public tstController(Iaaa srv) { _srv = srv; } public string get(string id) { return _srv.hello(id); }} |
2.2 测试失败
访问/api/tst/aaa,却直接报错Type 'WebApplication1.Controllers.tstController' does not have a default constructor,按照上面给的官网的集成说明提示更改Global.asax即可,改后如下(见修改点1和2)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //按如下步骤添加 // 1. Create a new Simple Injector container var container = new Container(); // a.1 webapi, frist register controller 修改点1 var services = GlobalConfiguration.Configuration.Services; var controllerTypes = services.GetHttpControllerTypeResolver() .GetControllerTypes(services.GetAssembliesResolver()); // register Web API controllers (important! http://bit.ly/1aMbBW0) foreach (var controllerType in controllerTypes) { container.Register(controllerType); } // 2. Configure the container (register) //container.Register<IUserService, UserService>(Lifestyle.Transient); //container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Singleton); //随便写个例子测试,名字就不计较了,Lifestyle的区别自行查文档 container.Register<Iaaa, aaa>(Lifestyle.Transient); // 3. Optionally verify the container's configuration. container.Verify(); // 4. Store the container for use by Page classes. //WebApiApplication.Container = container; System.Web.Mvc.DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); // a.2 webapi 按照文档,写在verify()后面 修改点2 GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); // 5. register global filters //如果有注册全局过滤器的需要加此节点,和下面注释掉的方法 //RegisterGlobalFilters(GlobalFilters.Filters, container); } //public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container) //{ //} } |
再测试就通过了
3,通过属性注入
我们上面演示的都是通过构造器注入,关于属性注入,SimpleInjector做了严格限制,但是还是支持,需要显式注入:http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios&referringTitle=Home#Property-Injection
直接演示一种最简单的方法吧:
|
1
2
3
|
container.RegisterInitializer<HandlerBase>(handlerToInitialize => { handlerToInitialize.ExecuteAsynchronously = true;}); |
所以完成版的Global.asax如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //按如下步骤添加 // 1. Create a new Simple Injector container var container = new Container(); // a.1 webapi, frist register controller 修改点1 var services = GlobalConfiguration.Configuration.Services; var controllerTypes = services.GetHttpControllerTypeResolver() .GetControllerTypes(services.GetAssembliesResolver()); // register Web API controllers (important! http://bit.ly/1aMbBW0) foreach (var controllerType in controllerTypes) { container.Register(controllerType); } // 2. Configure the container (register) //container.Register<IUserService, UserService>(Lifestyle.Transient); //container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Singleton); //随便写个例子测试,名字就不计较了,Lifestyle的区别自行查文档 container.Register<Iaaa, aaa>(Lifestyle.Transient); container.RegisterInitializer<tstController>(c => c.s2 = new bbb());//显然,其实就是手动指定 // 3. Optionally verify the container's configuration. container.Verify(); // 4. Store the container for use by Page classes. //WebApiApplication.Container = container; System.Web.Mvc.DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); // a.2 webapi 修改点2,按照文档,写在verify()后面 GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); // 5. register global filters //如果有注册全局过滤器的需要加此节点,和下面注释掉的方法 //RegisterGlobalFilters(GlobalFilters.Filters, container); } //public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container) //{ //} } |
完整版的webapi的controller如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class tstController : ApiController{ private Iaaa _srv; public Ibbb s2 { get; set;} //注意s2,是一个属性 public tstController(Iaaa srv) { _srv = srv; } //演示构造函数注入 public string get(string id) { return _srv.hello(id); } //演示属性注入 public string get() { return s2.curtime; }} |
取名字随意了点,包涵。
访问/api/tst/,得到current time is: 2013-12-15T23:06:0,我们并没有在构造器中初始化Ibbb,但已经是从aaa对象里取到了值,测试通过。
4,示例代码
git clone https://github.com/walkerwzy/simpleinjectorSample.git
SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示的更多相关文章
- ASP.NET Web API 2 中的属性路由使用(转载)
转载地址:ASP.NET Web API 2 中的属性路由使用
- Web API 2中的属性路由
Web API 2中的属性路由 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.ht ...
- ASP.NET Web API 2中的属性路由(Attribute Routing)
如何启用属性路由并描述属性路由的各种选项? Why Attribute Routing? Web API的第一个版本使用基于约定的路由.在这种类型的路由中,您可以定义一个或多个路由模板,这些模板基本上 ...
- Web API集成Azure AD认证
1.声明的介绍 基于角色的授权管理,适用于角色变化不大,并且用户权限不会频繁更改的场景. 在更复杂的环境下,仅仅通过给用户分配角色并不能有效地控制用户访问权限. 基于声明的授权有许多好处,它使认证和授 ...
- ASP.NET MVC4中调用WEB API的四个方法
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
- MVC4 WebAPI(二)——Web API工作方式
http://www.cnblogs.com/wk1234/archive/2012/05/07/2486872.html 在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些 ...
- Asp.Net Web API 2第八课——Web API 2中的属性路由
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...
- ASP.NET Web API - 使用 Castle Windsor 依赖注入
示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer private static IWindsorContainer _container; 在 Applica ...
- Web Api集成Swagger
WebApi集成Swagger 1.新建一个WebApi空项目 2.新建一个Person实体类: public class Person { public int ID { get; set; } p ...
随机推荐
- Ubuntu下搭建ASP.NET 5
在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要 ...
- Cocos2d-x场景变化相关功能介绍
现场由导演级交换机Director实现.之间的相关的功能,如下面: runWithScene(Scene* scene).该函数能够执行场景.仅仅能在启动第一个场景时候调用该函数.假设已经有一个场景执 ...
- Android - 和其他APP交互 - 获得activity的返回值
启用另一个activity不一定是单向的.也可以启用另一个activity并且获得返回值.要获得返回值的话,调用startActivityForResult()(而不是startActivity()) ...
- 百度云盘建svnserver步骤
安装tortoisesvn(略) 安装visualsvn(主server您可以使用)(略步骤)例如下面的安装文件夹后,: 注冊百度账号.进入百度云盘页面,建立目录,如mysvn. 下载百度云盘clie ...
- 使用mysqlbinlog工具的基础上及时恢复数据的位置或点
使用mysqlbinlog工具的基础上及时恢复的位置或点 MySQL备份一般采取完全备份的形式加日志备份.让我们运行一个完整备份,每天.每小时运行二进制日志备份. 这样在MySQL Server故障后 ...
- x264 - open gop and closed gop
GOP - Group of picture(影像集团),它指的是两个I帧之间的距离. Reference(基准期). 它指的是两个P帧之间的距离. 简而言之, 跨参考gop的,变open gop: ...
- POJ 2756 Autumn is a Genius 采用string大数减法
标题意味着小神童.加减可以计算. 只是说这个小神童的学科知识,究竟有多神,自己给自己找. 最后,因为数据是非常非常巨大的,我听说关闭50k结束了50000数字总和,可以想见他神教. 这似乎也是考试题目 ...
- j经常使用ava应用server
什么是应用server它?它主要提供的执行环境的应用程序,为组件提供服务. 要了解更多关于,您可以查看我的博客:何为容器? Java 的应用server非常多,从功能上分为两类:WEB 应用serve ...
- android 反编译,反,注射LOG
反编译smali注射显示LOG该代码.以后使用: .class public Lnet/iaround/connector/DebugClass; .super Ljava/lang/Object; ...
- 正确lua简单的扩展,可以加速相关C++数据。
很早的时候,我有一件事纠结.如果,我在这里C++打开界面脚本.使用C++其中一个目标,和.我的程序有很多不同的lua虚拟机.每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lu ...