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

分类: c#.net MVC

标签: DIsimpleinjector

时间: 2024-10-08 09:25:45

SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示的相关文章

ASP.NET Web API 2中的属性路由(Attribute Routing)

如何启用属性路由并描述属性路由的各种选项? Why Attribute Routing? Web API的第一个版本使用基于约定的路由.在这种类型的路由中,您可以定义一个或多个路由模板,这些模板基本上是参数化字符串.当框架收到请求时,它会将URI与路由模板进行匹配. 基于约定的路由的一个优点是模板在单个位置定义,并且路由规则在所有控制器上一致地应用.遗憾的是,基于约定的路由使得很难支持RESTful API中常见的某些URI模式.例如,资源通常包含子资源:客户有订单,电影有演员,书有作者,等等.

ASP.NET MVC4中调用WEB API的四个方法

http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法.就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强大的服务.然而,越来越多的互联网应用,希望将服务只是通过HTTP发布出去,而不是使用复杂的SOAP协议.为了解决这个问题,ASP.NET WebAPI就出现了.

MVC4 WebAPI(二)——Web API工作方式

在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些问题:1.客户端和WebService之间文件传输2.客户端或者服务端的安全控制要解决这些问题,要了解一下WebAPI的基本工作方式. (一)WebAPI中工作的Class 在MVC中大家都知道,获取Request和Response使用HttpRequest和HttpResponse两个类,在WebAPI中使用两外两个类:HttpRequestMessage 和HttpResponseMessage,分别用于封装Requ

ASP.NET Web API - 使用 Castle Windsor 依赖注入

示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer 1 private static IWindsorContainer _container; 在 Application_Start() 中,创建该容器 1 _container = new WindsorContainer(); 调用 Container Install 方法,向容器内注册组件 1 _container.Install(FromAssembly.This()); 该语句会调用整个程序集中

Asp.Net Web API 2第八课——Web API 2中的属性路由

参考页面: http://www.yuanjiaocheng.net/webapi/web-api-gaisu.html http://www.yuanjiaocheng.net/webapi/create-web-api-proj.html http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-api-controller.html http://www.yuan

Web Api集成Swagger

WebApi集成Swagger 1.新建一个WebApi空项目 2.新建一个Person实体类: public class Person { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } } 3.新建一个PersonAPI控制器(PersonController) public class PersonController : ApiCon

在Web API中使用Swagger-UI开源组件(一个深坑的解决)

介绍: Swagger-Ui是一个非常棒的Web API说明帮助页,具体详情可自行Google和百度. 官网:http://swagger.io/    GitHub地址:https://github.com/swagger-api/swagger-ui 使用: Swagger-Ui是一个用纯前端语言开发的项目,所有强大的功能全靠JS实现.为了能在.Net的Web API项目中使用,我们借用domaindrivendev开发的Swashbuckle进行配置.配置方法如下: 1.在Nuget中安装

为 ASP.NET Web API 创建帮助页面(转载)

转载地址:http://www.asp.net/web-api/overview/creating-web-apis/creating-api-help-pages 当创建web API 时,经常要创建一个帮助页,以便其他开发人员知道如何调用您的 API.您可以手动创建的所有文档,但最好是尽可能多地自动生成. 为了简化这一任务,ASP.NET Web API 提供一个库自动生成帮助页. 创建 API 帮助页 安装ASP.NET 和 Web 工具 2012.2 的更新.此更新集成到 Web API

如何设计出优美的Web API?

1. 概述 WEB API的应用场景非常丰富,例如:将已有系统的功能或数据开放给合作伙伴或生态圈:对外发布可嵌入到其他网页的微件:构建前后端分离的WEB应用:开发跨不同终端的移动应用:集成公司内部不同系统等等.在上述场景里,你可能是WEB API的使用者,也可能是设计者,但你知道如何评判WEB API的优劣吗? 2. 评判标准 我们可以从三个维度来评判一个WEB API的优劣: 易于使用:WEB API的用户是程序还是人?我觉得首先是人,然后是程序.为什么这么说呢?是否采用某个WEB API的决