您的位置:首页 > 编程语言 > Java开发

TinyFrame续篇:整合Spring IOC实现依赖注入

2014-03-06 23:32 543 查看
上一篇主要讲解了如何搭建基于CodeFirst的ORM,并且在章节末我们获取了上下文对象的实例:BookContext。这节主要承接上一篇,来讲解如何整合SpringIOC容器实现控制反转,依赖注入功能。

首先,我们来定义一个接口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]

大家可以参看我之前的文章来了解如何创建基于WCF的RestfulService,这里我就不细讲了。

需要注意的是,首先我们初始化了一个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在配置文件中指定一下,就可以轻松实现业务追加或者更新了,非常便于维护。

配置完成后,当我们运行之后,就可以看到正确的浏览效果了:









这节就到这里,下节准备讲解如何实现日志拦截和用户认证拦截。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: