TinyFrame续篇:整合Spring IOC实现依赖注入
2014-03-06 23:32
543 查看
上一篇主要讲解了如何搭建基于CodeFirst的ORM,并且在章节末我们获取了上下文对象的实例:BookContext。这节主要承接上一篇,来讲解如何整合SpringIOC容器实现控制反转,依赖注入功能。
首先,我们来定义一个接口IBookRepository,用于描述所有的元数据操作集合,所谓元数据操作集合,是指不含有任何业务逻辑的操作集合,只是针对单表操作:
[code]{
[/code]
然后新建一个BookRepository类,用于提供其实现,由于这里篇幅有限,我就只实现GetAllBooks方法和GetBook(intbookID)方法:
[code]{
[/code]
建立好以后,我们新建一个基于WCFRESTServiceApplication模板的Web项目项目,并命名为BookStore.RestService,用来消费刚刚创建的操作:
当这个项目创建好以后,我们首先需要添加对Spring的引用:
Common.Logging.dll
Spring.Aop.dll
Spring.Core.dll
然后新建一个ServiceBase类,用于初始化IOC容器:
[code]usingSystem.Collections.Generic;
[/code]
创建完毕后,新建一个BookService类,继承自ServiceBase类:
[code]{
bookRepository=(IBookRepository)applicationContext["BookRepository"];
[/code]
大家可以参看我之前的文章来了解如何创建基于WCF的RestfulService,这里我就不细讲了。
需要注意的是,首先我们初始化了一个IBookRepository接口,然后在其构造函数中,我们从Spring容器中去拿继承自IBookRepository接口的操作实例。其中,applicationContext["BookRepository"]代码段表明我们是要去web.config配置文件中去取BookRepository的节点声明。下面是配置节点部分:
首先是configSections节点声明,用于引入Spring类库配置:
[code]<sectionGroupname="spring">
[/code]
其次是<spring>节点,用于容器配置:
[code]<context>
[/code]
由于配置比较简单,我这里就不多说了。这样进行依赖注入后的好处就是,当以后业务需求变更,无论是增加新的功能,还是更换现有的功能,无需将整个项目编译,只需要将更改的部分编译过,然后将dll在配置文件中指定一下,就可以轻松实现业务追加或者更新了,非常便于维护。
配置完成后,当我们运行之后,就可以看到正确的浏览效果了:
这节就到这里,下节准备讲解如何实现日志拦截和用户认证拦截。
首先,我们来定义一个接口IBookRepository,用于描述所有的元数据操作集合,所谓元数据操作集合,是指不含有任何业务逻辑的操作集合,只是针对单表操作:
publicinterfaceIBookRepository
[code]{
IQueryable<Book>GetAllBooks();
BookGetBook(intbookID);
boolInsertBook(Bookbook);
boolUpdateBook(BookoriginalBook,BookupdatedBook);
boolDeleteBook(intid);
//==============================
IQueryable<BookLend>GetAllBookLends();
BookLendGetBookLend(intbookLendID);
boolInsertBookLend(BookLendbookLend);
boolUpdateBookLend(BookLendoriginalBookLend,BookLendupdatedBookLend);
boolDeleteBookLend(intid);
//==============================
IQueryable<BookType>GetAllBookTypes();
BookTypeGetBookType(intbookTypeID);
boolInsertBookType(BookTypebookType);
boolUpdateBookType(BookTypeoriginalBookType,BookTypeupdatedBookType);
boolDeleteBookType(intid);
//==============================
IQueryable<BookPlace>GetAllBookPlaces();
BookPlaceGetBookPlace(intbookPlaceID);
boolInsertBookPlace(BookPlacebookPlace);
boolUpdateBookPlace(BookPlaceoriginalBookPlace,BookPlaceupdatedBookPlace);
boolDeleteBookPlace(intid);
//==============================
IQueryable<Student>GetAllStudents();
StudentGetStudent(intstudentID);
boolInsertStudent(Studentstudent);
boolUpdateStudent(StudentoriginalStudent,StudentupdatedStudent);
boolDeleteStudent(intid);
//=====================================
IQueryable<Student>GetStudentsByBookLend(intbookLendID);
IQueryable<Book>GetBooksByBookLend(intbookLendID);
IQueryable<Book>GetBookByType(intbookTypeID);
IQueryable<Book>GetBookByPlace(intbookPlaceID);
}
[/code]
然后新建一个BookRepository类,用于提供其实现,由于这里篇幅有限,我就只实现GetAllBooks方法和GetBook(intbookID)方法:
publicclassBookRepository:IBookRepository
[code]{
publicBookRepository()
{
this.context=newBookContext();
}
privateBookContextcontext;
publicIQueryable<Book>GetAllBooks()
{
returncontext.Books.AsQueryable();
}
publicBookGetBook(intbookID)
{
returncontext.Books.Where(c=>c.ID==bookID).FirstOrDefault();
}
//commenthere...
}
[/code]
建立好以后,我们新建一个基于WCFRESTServiceApplication模板的Web项目项目,并命名为BookStore.RestService,用来消费刚刚创建的操作:
当这个项目创建好以后,我们首先需要添加对Spring的引用:
Common.Logging.dll
Spring.Aop.dll
Spring.Core.dll
然后新建一个ServiceBase类,用于初始化IOC容器:
usingSystem;
[code]usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSpring.Context.Support;
usingSpring.Context;
namespaceBookStore.RestService
{
publicclassServiceBase
{
publicServiceBase()
{
applicationContext=ContextRegistry.GetContext();
}
protectedIApplicationContextapplicationContext=null;
}
}
[/code]
创建完毕后,新建一个BookService类,继承自ServiceBase类:
namespaceBookStore.RestService
[code]{
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
publicclassBookService:ServiceBase
{
publicBookService()
:base()
{
bookRepository=(IBookRepository)applicationContext["BookRepository"];
}
privateIBookRepositorybookRepository;
[WebInvoke(
Method="GET",
ResponseFormat=WebMessageFormat.Xml,
BodyStyle=WebMessageBodyStyle.Bare,
UriTemplate="/GetAllBooks/")]
publicList<Book>GetAllBooks()
{
returnbookRepository.GetAllBooks().ToList();
}
[WebInvoke(
Method="GET",
ResponseFormat=WebMessageFormat.Xml,
BodyStyle=WebMessageBodyStyle.Bare,
UriTemplate="/GetBookByID/?id={id}")]
publicBookGetBookByID(intid)
{
returnbookRepository.GetBook(id);
}
}
}
[/code]
大家可以参看我之前的文章来了解如
需要注意的是,首先我们初始化了一个IBookRepository接口,然后在其构造函数中,我们从Spring容器中去拿继承自IBookRepository接口的操作实例。其中,applicationContext["BookRepository"]代码段表明我们是要去web.config配置文件中去取BookRepository的节点声明。下面是配置节点部分:
首先是configSections节点声明,用于引入Spring类库配置:
<configSections>
[code]<sectionGroupname="spring">
<sectionname="context"type="Spring.Context.Support.ContextHandler,Spring.Core"/>
<sectionname="objects"type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
</sectionGroup>
[/code]
其次是<spring>节点,用于容器配置:
<spring>
[code]<context>
<resourceuri="config://spring/objects"/>
</context>
<objectsxmlns="http://www.springframework.net">
<objectname="BookRepository"type="BookStore.Data.BookRepository,BookStore.Data"singleton="false"/>
</objects>
</spring>
[/code]
由于配置比较简单,我这里就不多说了。这样进行依赖注入后的好处就是,当以后业务需求变更,无论是增加新的功能,还是更换现有的功能,无需将整个项目编译,只需要将更改的部分编译过,然后将dll在配置文件中指定一下,就可以轻松实现业务追加或者更新了,非常便于维护。
配置完成后,当我们运行之后,就可以看到正确的浏览效果了:
这节就到这里,下节准备讲解如何实现日志拦截和用户认证拦截。
相关文章推荐
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- spring 框架中的依赖注入(IOC--设值注入)---使用xml简单配置文件---的具体实例的简单实现
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解
- Spring IoC依赖注入的实现
- IoC/依赖注入、以及在Spring中的实现 (转载)
- 【Spring源码--IOC容器的实现】(六)Bean的依赖注入
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- SSH之Spring——IOC如何实现依赖注入
- Spring的IOC逐层深入——依赖注入的两种实现类型
- IoC 依赖注入、以及在Spring中的实现
- 依赖、依赖倒转原则、IoC/依赖注入、以及在Spring中的实现
- 依赖、依赖倒转原则、IoC/依赖注入、以及在Spring中的实现
- 初步理解spring ioc原理(读完可自己实现依赖注入部分的spring框架)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型
- IOC,依赖倒置 (理解) Spring依赖注入的实现技术是:动态代理
- Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现
- IoC 依赖注入、以及在Spring中的实现
- IOC,依赖倒置 (理解) Spring依赖注入的实现技术是:动态代理
- spring 框架中的依赖注入(IOC--设值注入)--使用注解--的具体实例的简单实现
- Spring -- 控制反转IoC/依赖注入DI的实现