见http://simpleinjector.codeplex.com/wikipage?title=Integration%20Guide&referringTitle=Home
我们自己建个MVC4项目测试
只需要安装Mvc的集成即可,其它的依赖会自动安装:
Install-Package SimpleInjector.Integration.Web.Mvc
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
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
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/
http://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration&referringTitle=Integration%20Guide
在同一个项目里测试就行了,更好演示与mvc和与web api集成的区别,所以也不需要新建项目,及添加引用了
基本上是复制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);
}
}
|
访问/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)
//{
//}
}
|
再测试就通过了
我们上面演示的都是通过构造器注入,关于属性注入,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对象里取到了值,测试通过。
git clone https://github.com/walkerwzy/simpleinjectorSample.git