技术开发 频道

Nbear高级应用--使用本地服务工厂

IT168技术文档】

    当暂时不需要分布式支持时,我们的系统可以先简单使用一个本地服务工厂。在下一页使用分布式服务工厂中,我们将看到,从一个本地服务工厂转换到分布式服务工厂,从而为应用程序扩展分布式支持是如何容易。我们甚至不需要修改任何服务消费端和服务实现端的代码。 

    基于服务的应用程序开发第一步是必须为服务定义接口,下面是一个简单的服务接口示例: 

public interface ISampleService : NBear.IoC.Service.IServiceInterface { NorthwindEntities.Products[] LoadAllProductsByPage(int pageSize, int pageNo); TestAccessDbAccessEntities.User[] LoadAllUsers(); }

    我们注意到,一个服务接口除了是一个标准的接口之外,必须继承自NBear.Ioc.Service.IServiceInterface。为什么要继承自NBear.Ioc.Service.IServiceInterface呢?主要是因为我们的服务会部署在IoC容器中,使用基类接口就能方便的从容器中识别出所有的服务。 

    接着,服务的实现端负责实现该接口,我们假设程序集ServiceImpls.dll中的SampleServiceImpl类实现了上面这个接口,而ISampleService定义于ServiceInterfaces.dll程序集中。 

    下面就是如何部署该服务和在消费端程序中使用该服务了。我么还是以一个WEB程序为例。 

    部署配置服务 

    首先需要将服务部署到Web.config中。例如: 

<?xml version="1.0"?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" /> </configSections> <castle> <components> <!--You can use standard castle component decleration schema to define service interface impls here--> <component id="sample service" service="ServiceInterfaces.ISampleService, ServiceInterfaces" type="ServiceImpls.SampleServiceImpl, ServiceImpls" /> </components> </castle> <appSettings/> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies/> </compilation> <authentication mode="Windows"/> <httpModules/> </system.web> </configuration>

    注意代码中加粗的部分,首先,我们要定义个自定义section(注意这是一个标准的castle配置块)。接着在这个castle配置块中,我们部署了前面定义的服务。注意,id属性指示了一个名称,这个名称是随意的key,但是不要重复。service属性指示这个服务的接口和所在的程序集,type属性指示则各服务的实现类和所在的程序集。Ok,这样就配置完成了。 

    通过服务工厂使用服务 

    要使用部署到配置文件中的服务,我们就要用到NBear.IoC.Service.ServiceFactory类。 

    例如,要使用上面创建和部署的SampleService,我们在Web工程的App_Code目录中建一个ServiceFactory.cs文件,这个文件简单的实利化一个共享的NBear.IoC.Service.ServiceFactory类的实例,并简单的传递调用: 

public abstract class ServiceFactory { private ServiceFactory() { } private static NBear.IoC.Service.ServiceFactory factory = NBear.IoC.Service.ServiceFactory.Create(); public static IServiceInterfaceType GetService<IServiceInterfaceType>() where IServiceInterfaceType : IServiceInterface { return factory.GetService<IServiceInterfaceType>(); } }

    在以上代码中,可以看到,我们实利化了一个.IoC.Service.ServiceFactory类的实例。那么,接下来,在需要使用服务的页面,我们就能象下面的代码这样非常方便的使用服务了: 

public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ServiceInterfaces.ISampleService service = ServiceFactory.GetService<ServiceInterfaces.ISampleService>(); GridView1.DataSource = service.LoadAllProductsByPage(10, 2); GridView2.DataSource = service.LoadAllUsers(); DataBind(); } }

 

    在以上代码中,我们可以看到,服务的接口定义必须在WEB工程可以访问(WEB工程必须引用定义服务接口的程序集ServiceInterfaces.dll)。给定需要返回的服务接口作为范型参数,ServiceFactory类就能为我们返回接口的实现类实例,我们就能使用服务了。

0
相关文章