词条统计
浏览次数:7201 次
编辑次数:3次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者

到目前为止, CategoryController 依赖于 ICategoryService ,虽然我们在它的构造函数中提供了一个默认实现,但现在我们对这个默认的 CategoryService 不满意,所以重新设计了一个新的服务:


???

下面我们就要把这个 NewCategoryService 注入到 CategoryController 中。

打开文件网站根目录下的文件 framework/data/wojilu.DI.MapItem.config:

新增加一行:

?

这是一个json格式的依赖注入文件(就是我们前面讲过的缓存数据库),我们在其中声明了一个名叫 newCategoryService 的对象。

再添加一行,声明CategoryController对象

注意选定的部分,这行配置比上面两行多了一个属性 Map,Map的值是一个映射对象,意思是:我们让CategoryController的属性categoryService,使用上面一个叫 newCategoryService 的对象。

wojilu MVC framework 在执行的时候,使用IOC容器创建 CategoryController 对象:

1、先通过构造函数new一个 CategoryController 对象
2、然后检查依赖注入的配置文件,是否被声明,并且是否被注入了;如果有注入声明(即上面的Map属性),则按照Map属性的指示,将对象注入进去。

整个流程走下来,最终 CategoryController 将依赖于 newCategoryService 对象,这个对象的类型是 wojilu.cms.Service.NewCategoryService

我们看下效果:

?

果然,分类列表里面呈现的是 NewCategoryService 服务提供的数据。

特别说明:为什么在controller的构造函数往往手动new了一个service?

new只是提供一个默认的实现,仍然可以注入的,比如如下代码——


?? ?[App( typeof( BlogApp ) )]

?? ?public partial class PostController : ControllerBase {


?? ? ? ?public IBlogPostService postService { get; set; }


?? ? ? ?public PostController() {

?? ? ? ? ? ?postService = new BlogPostService();

?? ? ? ?}


以上代码中,蓝色代码是给 postService 提供了默认的实现,而红色部分既可以get,也可以set,也就是说,可以被注入自定义的service的


bet36体育655365.com具体的流程是,IOC容器通过默认方式创建PostController,此时postService已经被赋予了默认的BlogPostService;然后根据IOC配置文件,查看有没有注入配置,如果有,就用配置中的service注入到postService中,从而替换了默认的service。?