词条统计
浏览次数:5822 次
编辑次数: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的


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