DotNET企业架构应用实践 - 用服务定位器(SL)完成服务的多种实现的统一调用

        前面的文章服务定位器(SL)与AgileEAS.NET中的实现介绍了服务定位器的一些概念、应用场景与AgileEAS.NET平台中SL的实现,本文是这骗文件的一个例子与Demo,详细的演示SL在应用开发中的使用。

        下面我说开始例子,假设有这么一个应用场景,我们需求一个Hello服务,并且需要在XML WebService、.NET Remoting和本地同进程中三种不同环境的应用,也就是说,这个服务可能会有三中实现,具体使用那一个,在应用过程中决定,我先贴个简单的类图:

        现在我们来开始干活,一步一步实现这个应用,首先定义服务接口,建一个名称为Hello.Interface的类库项目,定义一个IHello接口:

    public interface IHello
    {
        string SayHello(string name);
    }

                 接着我们做WebService实现,添加一个Hello.WebService的ASP.NET Web服务应用程序并引用Hello.Interface,添加一个HelloService的WebService:

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class HelloWebService : System.Web.Services.WebService,Hello.Interface.IHello
    {
        [WebMethod]
        public string SayHello(string name)
        {
            return "hello," + name;
        }
    }

        实现.NET Remoting和LocalComponent,添加一个名称为Hello.Service类库项目,添加一个类Hello:

 

 

 

        public string SayHello(string name)
        {
            return "hello," + name;
        }

        实现一个简单的.NET Remoting的运行环境,建一个名称为Hello.ServiceConsole的控制台项目:

 

    class Program
    {
        static void Main(string[] args)
        {
            TcpChannel channel = new TcpChannel(9001);
            ChannelServices.RegisterChannel(channel, false);

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello.Service.HelloService),
                "Hello", WellKnownObjectMode.Singleton);
            System.Console.ReadLine();
        }
    }

        最后完成我们的调用客户端,建一控制台项目Hello.Client,引用Hello.Interface项目和EAS.IOCContainer.dll、EAS.ServiceLocator.dll程序组,定义服务消费者HelloClient:

    class HelloClient
    {
        IHello hello = null;

        public HelloClient()
        {
            this.hello = ServiceFactory.GetService("HelloService", typeof(IHello)) as IHello;
        }

        public IHello Hello
        {
            get
            {
                return this.hello;
            }
        }
    }

        控制台程序入口Program :

 

    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(new HelloClient().Hello.SayHello("james"));
            System.Console.ReadLine();
        }
    }

        定义配置文件App.config :

<configuration>
	<configSections>
		<section name="EAS.Services"
				 type="EAS.ServiceLocators.ServiceConfigHandler,EAS.ServiceLocator" />
		<section name="EAS.Objects"
				 type="EAS.Objects.ConfigHandler,EAS.IOCContainer"/>
	</configSections>
	<EAS.Objects>
		<object name="HelloObject" LifestyleType="Thread"
				type="Hello.Service.HelloService,Hello.Service" />
	</EAS.Objects>
	<EAS.Services>
		<Services>
			<Service name="HelloService" service-type="DotNetRemoting"
					 Singleton=" true" url="tcp://localhost:9001/Hello"/>
				<!--<Service name="HelloService" service-type="LocalComponent"
							component="HelloObject" />-->
			<!--<Service name="HelloService" service-type="WebService" Singleton=" true"
					 url="http://localhost:56824/HelloWebService.asmx"/>-->
		</Services>
	</EAS.Services>
</configuration>

        运行客户段,可以看到如下的输入截图:

        是不是很简单,在实际应用中,对于这种服务运行环境的未知性,我们可以通过这种简单的方法进行处理,服务消费者只需求知道接口,而无需知道具体的实现,开发人员可以根据客户的不同应用场景而做出不同的实现,上例中的服务定义配置项中,我注释了DotNetRemoting和LocalComponent两种方式的Hello服务,大家可以释放放开其中的一个而注释另外两个用于配置运行。

         这个例子的源代码我已上传,请下载Hello.Example.rar

QQ群:15118502

链接:AgileEAS.NET应用开发平台介绍

AgileEAS.NET之敏捷并行开发方法

敏捷软件工程实验室

时间: 2024-07-31 13:09:06

DotNET企业架构应用实践 - 用服务定位器(SL)完成服务的多种实现的统一调用的相关文章

DotNET企业架构应用实践-实例架构设计中的业务分层-提取独立的业务层

      说明一下,原本的思路是通过一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录相关的文章来逐步讲解基于AgileEAS.NET平台进行应用开发的文章,但是在进行案例讲解的过程,我们不得不扯到有关于AgileEAS.NET平台进行应用开发的架构设计方面的东西,我就把一些与架构有关的文章分离出来讲,了,我是基于AgileEAS.NET平台的应用开发实例来讲解架构设计,所以本文应该还有个副标题"一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-提取独立

DotNET企业架构应用实践-企业管理软件架构(计算)的历史与发展(上)

         企业管理软件是计算机软件应用的一个重要领域,在今天计算机软件除面向科学计算之外应用最广阔的也是企业管理应用,可以说计算机技术的发展推动着企业应用发展,企业管理需要也一方面影响着计算机技术的发展,今天,在我们的周末,企业管理应用软件开发人员占了总开发人员中的极大的比例.          今天我们就来通过回顾计算技术在企业应用中的发展历程来看看软件架构的发展. 主机-字符终端          在PC机没现世之前,极小数的企业使用大型业务处理主机处理企业计算机任务,在那个时候,计

DotNET企业架构应用实践-企业管理软件架构的历史与发展(中)- 分布式系统

在前几天的DotNET企业架构应用实践-企业管理软件架构(计算)的历史与发展(上)一文中,介绍了在企业管理软件架构发布中的主机-终端结构.以及客户机-服务器结构.浏览器-服务器结构,本文今天向大家介绍有关于分布式计算及SOA架构方面的知识. 广义分布式系统 分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件.内聚性是指每一个数据库

DotNET企业架构应用实践-系统架构与性能-在业务中实例使用缓存与缓存查询-附上视频

回顾与说明      本文是DotNET企业架构应用实践系列中的一篇文章,同时也是一步一步教你使用AgileEAS.NET基础类库进行应用开发系统中的一篇文章,所以本文应该还有一个副标题"一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在商口入库业务中使用缓存与缓存查询",为什么会是这样呢?这个原因主要是我希望我在讲企业架的时候有结合具体的实例进行讲解,而不是泛泛而谈,而在AgileEAS.NET平台的案例开发中也正好涉及这样的内容.     在前面

DotNET企业架构应用实践-系列目录

系列介绍          我一直在写关于AgileEAS.NET平台的一系列文章,也一直在推广AgileEAS.NET平台,本来也无意于独立的写这么一个系列,最早我是混杂在AgileEAS.NET平台中进行介绍的,即介绍平台的同时介绍平台以及应用平台进行开发所涉及的一些架构知识.          对于系统架构,我不能也无法系统的讲解到系统架构所涉及的每一个方面.技术点,我只能把我近10年的开发经历的一些关于系统架构的理解以及一些我自己在开发实践之中的一些架构总结写出来以供大家参考.     

DotNET企业架构应用实践-系统架构与性能-理论依据及相关技术

性能优化介绍       在企业应用开发领域,企业架构与性能将会是一个恒久的话题,如何提高性能.性能优化也将是一个长期和不断改进的过程,有人在硬件投入上下功夫.有人在数据库系统.数据库设计上下功能.有人在系统架构中下功夫.有人在程序下功能,总的来说,性能优化系是一个多方面的综合技术. 性能优化的理论依据       在计算机领域,缓存技术应该是一个非常久远的技术,CPU设计中高速缓存技术和操作系统内存管理中的分页.分段技术应该是我们每一位开发人员都熟悉的技术,在计算机体系结构与操作系统中,这两个

DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术

系列回顾       在前面的文章DotNET企业架构应用实践-系统架构与性能-理论依据及相关做法一文中我介绍了系统性能优化的理论做了一个概括的介绍,也简单的介绍了性能优化的过程及相关的技术关注点或者说是做法.       本文将基于系统架构与程序设计两方面入手,介绍系统架构与性能优化方向一种技术实践:缓存技术与ORM缓存查询. 缓存介绍       前面的文章DotNET企业架构应用实践-系统架构与性能-理论依据及相关做法我在系统优化的理论依据中简单的提到了CPU中的调整缓存操作系统中内存管理

DotNET企业架构应用实践-架构师成长之路-如何成为优秀架构师

      前面写过几篇与架构相关的文章,后来呢也就有了这想一个简单的想法,把我工作多年是有关于架构设计中的一点点滴和一些自我感觉还不错的经验分享出来,供大家参考和交流,虽然说我不能系统的给大家讲系统是系统架构,如何进行系统架构设计.因为我也没有系统的设计过,很多都是工作经历之中慢慢体会和总经,所以既使我能勉强的写出来,估计也不是很专业,因为我是个半路出家的"和尚",能把实际工作中的一些点滴说出来,把问题解决了,但我总是不怎么善于系统的讲解,忘大家谅解.       说到系统架构,就不

DotNET企业架构应用实践-基于接口开发介绍以及应用场景和案例

基于接口开发介绍          基于接口编程的本质是分离对象的实现与使用者之间的关系,即变更以下对象结构的依赖变化:                这样说的好处是客户对象依赖于服务接口,即在开发过程中我们只关注于服务接口的定义,而不关注于服务对象的具体实现,客户对象只有在运行期才通过解耦与后期绑定辅助工具(类)与具体的服务实现对象动态的建议依赖.          这样做的好处是很显然的,从技术上讲,如果把服务接口与服务实现分别放在不同的组件之中,那么修改了服务实现组件,我们不用重新编译客户