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类就能为我们返回接口的实现类实例,我们就能使用服务了

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3