什么是Websharp Service Locator 对于多层的应用系统来说我们通常把它们划分成客户端应用服务层和数据库在应用服务层我们需要考虑至少两个方面的问题 ü 如何实现业务逻辑 ü 如何向客户端提供服务 我们可能使用多种技术来实现服务的提供WebserviceNet Remoting甚至EJB等如此多的实现技术带来的很大的灵活性但同时也带来了问题其中一个就是有多少种服务端技术就得有多少种相应的客户端访问技术甚至在某些分布式应用系统中应用逻辑使用不同的技术开发存在于不同的机器上有的存在于客户机本机有的使用Net Remoting开发存在于局域网内有的使用因特网上的Web Service有的时候我们希望相同的业务逻辑能够支持不同的客户端 在这种情况下我们需要一个一致的服务访问编程模型以统合不同的服务访问模式简化系统的开发和部署Websharp Service Locator(以下简称WSL)提供了这样一种能力开发人员只需要定义服务访问接口就可以使用一致的方式透明的访问这些服务而不用理会这些服务之间的不同点框架会自动生成访问远程服务需要的代理 Websharp是sourceforge上的一个新的开源项目目标是提供一个Net环境下的轻量级的应用系统框架它包含了三个主要内容一个O/R Mapping框架一个AOP框架以及一个Service LocatorService Locator目前还只完成本地程序集定位器WebService定位器和Net Remoting定位器的初步开发但是我们已经可以使用它提供的框架功能来为我们的开发提供助力Websharp Service Locator下面的目标是实现对JEE的访问可以从 下载所有源代码 Websharp Service Locator的主要接口 WSL是一个轻量级的框架非常易于使用和扩展如果想使用WSL那么只有一个类需要打交道ServiceLocator它的定义如下 public abstract class ServiceLocator { public static object FindService(string serviceNameType clientInterface) } 如果你想用自己的定位器扩展这个框架那么只有一个接口需要扩展IServiceLocator这个接口非常简单只有一个方法 public interface IServiceLocator { object FindService(string serviceNameType clientInterface); } Websharp Service Locator的配置文件 需要在三个地方配置WSL 首先在configSections节中注册WSL配置文件处理类的的相关信息配置方法如下 <configSections> <section name=WebsharpEnterprise type=WebsharpEnterpriseEnterpriseConfigHandlerWebsharp /> configSections> 然后在WebsharpEnterprise节中注册不同的服务定位器如果你自己扩展了这个框架添加了新的服务定位器也在这里注册其中locator属性的格式是类全名Assembly名 服务定位器都是Singleton的下面是目前WSL支持的服务定位器的注册的信息 <WebsharpEnterprise> <ServiceTypes> <ServiceType name=LocalAssembly locator=WebsharpEnterpriseLocalAssemblyLocatorWebsharp /> <ServiceType name=WebService locator=WebsharpEnterpriseWebServiceLocatorWebsharp /> <ServiceType name=DotNetRemoting locator=WebsharpEnterpriseDotNetRemotingLocatorWebsharp /> ServiceTypes> WebsharpEnterprise> 最后在WebsharpEnterprise下的Services节中注册每个服务每个Service需要的属性取决于不同的Locator的实现但是nameservicetype 和deploymodel是必须的对于deploymodel可以有两种属性值Singleton和MultiInstance 下面是一个例子 <WebsharpEnterprise> <ServiceTypes> <ServiceType name=LocalAssembly locator=WebsharpEnterpriseLocalAssemblyLocatorWebsharp /> <ServiceType name=WebService locator=WebsharpEnterpriseWebServiceLocatorWebsharp /> <ServiceType name=DotNetRemoting locator=WebsharpEnterpriseDotNetRemotingLocatorWebsharp /> ServiceTypes> <Services> <Service name=HelloWorld servicetype=LocalAssembly deploymodel=Singleton type=EnterpriseClientHelloWorldEnterpriseClient /> <Service name=HelloWorldWebServiceservicetype=WebService deploymodel=Singleton url= namespace=/> Services> WebsharpEnterprise> 注对于配置文件在Web项目中可以是nfig文件对于Windows项目可以自己为项目添加一个nfig配置文件关项目配置文件的更多内容请参考MSDN的相关文档 如何使用Websharp Service Locator? 使用WSL一般的方法是这样的 定义一个同你需要访问的服务一致的接口(当然如果你的服务是实现某个接口的可以直接使用该接口)接口的方法名和参数必须同服务类的方法名和参数一致如果你的方法名和服务的方法名不一致那么可以使用ServiceMethodNameAttribute来指明服务的方法名 在配置文件按中注册你需要访问的服务 调用ServiceLocator 的FindService方法 调用接口的方法 下面是一些例子这些例子使用visual 开发同样可以从sourceforge下载 LocalAssemblyLocator 的Hello World例子 按照以下步骤进行 创建一个名为EnterpriseClient的windows console 项目加入Websharpdll的引用 添加一个类名为HelloWorld 然后添加一个名为GetHello的方法代码如下 public class HelloWorld { public string GetHello(string hello) { return hello; } } 添加一个名为 IHelloWorld 的接口代码如下 public interface IHelloWorld { string GetHello(string hello); [ServiceMethodName(GetHello)] string GetHello(string hello); } 填写配置文件 xml version= encoding=utf ?> <configuration> <configSections> <section name=WebsharpEnterprise type=WebsharpEnterpriseEnterpriseConfigHandlerWebsharp /> configSections> <WebsharpEnterprise> <ServiceTypes> <ServiceType name=LocalAssembly locator=WebsharpEnterpriseLocalAssemblyLocatorWebsharp /> <ServiceType name=WebService locator=WebsharpEnterpriseWebServiceLocatorWebsharp /> ServiceTypes> <Services> <Service name=HelloWorld servicetype=LocalAssembly deploymodel=Singleton type=EnterpriseClientHelloWorldEnterpriseClient /> Services> WebsharpEnterprise> configuration> 在Main方法中添加如下代码 public static void Main(string[] args) { IHelloWorld hello= ServiceLocatorFindService(HelloWorld |