基于WCF的SOA架构项目实战

http://www.cyqdata.com/cnblogs/article-detail-41620

本人才疏学浅,在现在的项目中即是程序员又是架构设计组组长。在使用WCF技术前看了无数号称WCF实战博客,没有一篇是我想要的。不过也算学到些皮毛。在此谢过,对你们的善意分享和辛勤劳动表示万分的感谢。由于以前是在csdn写博客,到博客园发文算是第一次。还请各位高手跳过,但愿不会浪费各位的表情。这里先上几张图,后面再讲过程。

  • 解决方案截图

架构过程遇到的问题和解决方法。

1、要不要使用dto对象,要不要建立DTO层?

解决办法是巧妙的将实体对象和dto对象合并,这样少了转换的过程。感觉还行。

样本如下:

namespace RTLS.Entities
{
    [Serializable, DataContract(IsReference = true)]
    [KnownType(typeof(SysRolefunc))]
    public class SysRole
    {
        [DataMember]
        public virtual int Roleid { get; set; }
        [DataMember]
        public virtual string Rolename { get; set; }
        [DataMember]
        public virtual bool Active { get; set; }
        [DataMember]
        public virtual string Desc { get; set; }
        [DataMember]
        public virtual DateTime? Timestamp { get; set; }
        [DataMember]
        public virtual string Remark { get; set; }

        private IList<SysRolefunc> list;

        //一对多关系:角色(Role)有一个或多个角色功能(SysRolefunc)
        [DataMember]
        public virtual IList<SysRolefunc> RoleFuncs
        {
            get
            {
                if (list == null)
                {
                    list = new List<SysRolefunc>();
                }
                return list;
            }
            set
            {
                list = value;
            }
        }        
    }
}

using System;
using System.ServiceModel;
namespace RTLS.IServices
{
    [ServiceContract]
    public interface ISysRoleService
    {
        [OperationContract]
        bool AddSysRole(RTLS.Entities.SysRole role);
        [OperationContract]
        bool DeleteSysRole(RTLS.Entities.SysRole role);
        [OperationContract]
        System.Collections.Generic.IList<RTLS.Entities.SysRole> GetAll(bool isActive);
        [OperationContract]
        System.Collections.Generic.IList<RTLS.Entities.SysRole> GetPageResults(int curPageNo, int limit,
                                                                               string name, bool isActive,
                                                                               ref int totalCount);
        [OperationContract]
        System.Collections.Generic.IList<RTLS.Entities.SysRole> GetRoleByUserId(int userID);
        [OperationContract]
        bool ModifySysRole(RTLS.Entities.SysRole role);
    }
}

namespace RTLS.Services
{
    /// <summary>
    /// 系统角色服务类
    /// </summary>
    public class SysRoleService : ISysRoleService
    {
        private SysRoleBiz biz = new SysRoleBiz();
        public bool AddSysRole(Entities.SysRole role)
        {
            var result = biz.AddSysRole(role);
            return result.Success();
        }

        public bool DeleteSysRole(Entities.SysRole role)
        {
            return biz.DeleteSysRole(role);
        }

        public IList<Entities.SysRole> GetAll(bool isActive)
        {
            return biz.GetAll(isActive);
        }

        public IList<Entities.SysRole> GetPageResults(int curPageNo, int limit, string name, bool isActive, ref int totalCount)
        {
            return biz.GetPageResults(curPageNo,limit,name,isActive,ref totalCount);
        }

        public IList<Entities.SysRole> GetRoleByUserId(int userID)
        {
            return biz.GetRoleByUserId(userID);
        }

        public bool ModifySysRole(Entities.SysRole role)
        {
            return biz.ModifySysRole(role);
        }
    }
}

虽然说不推荐这样用,但是工期有限啊。没有使用Linq,所以要真是dto-->entity,entity-->entity转换来转换去的要死人的。因为这个原因曾经打算放弃使用WCF,让客户端直接引用BLL和Model层。后来发现这样合并了之后可以继续下去了,就这样做了。对错先暂且不论。

2、怎么调试和设置WCF参数?

当然是摸索了,跌倒,跌倒...爬起来,再来!上几张图:

 <service behaviorConfiguration="RTLS.Services.ServiceBehavior"
      name="RTLS.Services.SystemFunctionService">
        <endpoint address="net.tcp://192.168.1.123:9998/RTLS_SysFun_Svr" binding="netTcpBinding" bindingConfiguration="myNetTcpBinding"
          name="net" contract="RTLS.IServices.ISystemFunctionService" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          name="mex" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://192.168.1.123:9998/RTLS_SysFun_Svr" />
          </baseAddresses>
        </host>
      </service>
    </services>

3.一个Winnt服务如何host多个wcf服务?

        protected override void OnStart(string[] args)
        {
            if (serviceHostes.Count > 0) serviceHostes.Clear();
            var configuration = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
            ServiceModelSectionGroup serviceModelSectionGroup = (ServiceModelSectionGroup)configuration.GetSectionGroup("system.serviceModel");
            // 开启每个服务
            foreach (ServiceElement serviceElement in serviceModelSectionGroup.Services.Services)
            {                
                var wcfServiceType = Assembly.Load("RTLS.Services").GetType(serviceElement.Name);
                var serviceHost = new ServiceHost(wcfServiceType);               
                serviceHostes.Add(serviceHost);
                serviceHost.Opened += delegate
                {
                    LogManager.WriteLog("Log", string.Format("{0}开始监听Uri为:{1}",
                    serviceElement.Name, serviceElement.Endpoints[0].Address.ToString()));
                };
                serviceHost.Open();                
            }            
        }

这个办法是在吉日大哥的通用权限组件里面看到的,这里对吉日大哥表示衷心的感谢!希望大伙尊重一下扎扎实实搞技术的人,我不是为了跟吉日大哥打广告。做人要懂得感恩!你技术牛,你鄙视我可以,我不羡慕你,也不一定要屌你。

4、怎样使用泛型工厂类来简化和重构代码?

这个正在尝试中,毕竟先完成了。

5、使用winnt服务的方式安装、发布容易吗?好用吗?

 /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                AssemblyInstaller myAssemblyInstaller;
                myAssemblyInstaller = new AssemblyInstaller();
                myAssemblyInstaller.UseNewContext = true;
                myAssemblyInstaller.Path = System.AppDomain.CurrentDomain.BaseDirectory + "\\" + System.AppDomain.CurrentDomain.FriendlyName;
                System.Collections.Hashtable mySavedState = new System.Collections.Hashtable();
                switch (args[0].ToLower())
                {
                    case "-i":
                        myAssemblyInstaller.Install(mySavedState);
                        myAssemblyInstaller.Commit(mySavedState);
                        myAssemblyInstaller.Dispose();
                        return;
                    case "-u":
                        myAssemblyInstaller.CommandLine = new string[1] { "/u" };
                        myAssemblyInstaller.Uninstall(null);
                        myAssemblyInstaller.Dispose();
                        return;
                    default:
                        System.Console.WriteLine("------参数说明------");
                        System.Console.WriteLine("- i 安装服务!");
                        System.Console.WriteLine("- u 卸载服务!");
                        System.Console.ReadKey();
                        return;
                }
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new RtlsHostSvr() 
            };
            ServiceBase.Run(ServicesToRun);

            想知道怎样调试服务程序像调试控制台程序一样吗? 把服务的OnStart方法标记为public new .默认是protected override.然后像下面那样取消那些注释,并注释上面  的代码就ok了。
            //var sHostSvr = new RtlsHostSvr();
            //sHostSvr.OnStart(null);
            //System.Threading.Thread.Sleep(10000);
            //sHostSvr.OnStop();
        }

作者: afeng124 发表于 2011-07-13 17:42 原文链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好消息:基于WCF构建企业级大型分布式SOA架构(中级篇)的源码开放下载了,可以向老师索取或者查看最后一个课时下载 下载即可获得如下大礼包:企业级大型分布式SOA框架源码 + 模板网站实践项目源码 + 框架工具、资料 + 初级篇全套源码、视频 学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁在用?——微软、腾讯、网易、戴尔、当当网、携程、招商银行、中国知网、申通快递、房天下、汽车之家等。微软在软件行业的龙头老大位置没有任何人能够否认,它总是站在开发技术的前沿。如今微软正高举.NET大旗继续向前,他正努力使开发变得更加轻松。 学习目标  1、让学员熟练掌握WCF的核心概念及相关编程技能,对WCF技术有一个全面的、深入的、系统的了解;  2、让学员对SOA架构设计的思想和方式具有初步的认识, 对后期我们将要学习的SOA架构有一个宏观的了解;  3、让学员通过完整的示例的学习, 能够熟练搭建开发环境, 服务构建,服务配置,服务调试、服务单元测试, Restful服务的编写, 客户端代理的编写、各种应用程序中消费使用服务等;  4、通过项目实战让学员达到1-3年工作经验水平。达到.NET软件工程师,.Net/C#研发工程师、中高级工程师等岗位所需技能; 课程简介 专注15年C#/.Net开发、科研,在多个中大型企业中负责过多个中大型项目的架构设计、开发、实施部署,积累丰富的研发及实践经验,为Net学习者快速掌握.Net企业级开发常用技术及架构,录制本视频课程系列(分为初级篇,中级篇,高级篇三大课程),采用实战项目从0开始一步步讲授如何搭建项目架构及分析各技术的优劣,提供系统/示例完整源码(价值高)及详细上课日志,及时为您解惑答疑,让课程价值无限; 无论您是Java、C++、Python还是其它语言的开发者,都可以学习本系列课程,因为这种架构设计思想和方式对任何语言来说是一样的,只是实现的技术、语言不一样而已;纯干货,含金量高,价格实惠,物超所值 ,配套的项目架构源码等均能直接应用于实际项目开发中;        课程特色        1:课程设计循序渐进,讲解细致,通俗易懂,由浅入深, 非常适合自主学习;        2:以PPT为大纲,教学过程示例丰富,强调技术关键点,并且分析透彻;先概念后示例再应用实践;        3:物美价廉,本着知识共享,帮助更多有需求者原则,毫无保留,此外,提供源代码/示例代码+课程资料+课程相关工具; 本课程示例程序解决方案 SOA架构部署图(中级篇) SOA架构特色(中级篇) SOA架构解决方案(中级篇) 与SOA架构配合开发的Web实战项目解决方案(中级篇) 教学理念        1:把需要工作的人变成工作需要的人;        2:创设立足学员,突出项目,强化技术,提高能力的教学局面; 注意 1.开发环境VS2015、Eclipse、Sql Server 2008R2; 2.赠送配套资料:详细注释的示例项目源码、详实的讲义等; 3.由初级篇—中级篇—高级篇,建议按顺序一节节学习,一节节理解;从而快速实现架构师之梦;
WCF全面解析(套装上下册)》由蒋金楠所著,是作者多年潜心研究WCF技术的心血之作,也是这些年来从事WCF开发的经验总结。书如其名,此书涵盖了WCF几乎所有的知识点,并对其底层框架进行了“庖丁解牛”式的剖析,力求将WCF的整个运行机制完整而清晰地呈现在读者面前。 《WCF全面解析(套装上下册)》上册的前四章在对WCF进行总体介绍的基础上,对构成终结点的三要素(地址、绑定和契约)进行了系统说明;随后的两章则着重剖析序列化和消息编码在WCF中的实现;第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你如何将理论应用于实践。 《WCF全面解析(套装上下册)》的下册主要涉及一些所谓的“高级”话题,主要包括如何在分布式环境中处理异常(第1章);元数据的导入与导出、发布与获取如何实现(第2章);如何利用WCF对事务的支持将分布式事务引入服务(第3章);如何利用并发与限流机制提高服务的吞吐量和可用性(第4章);如何利用可靠会话机制确保消息的“使命必达”(第5章);如何利用队列服务提供离线通信的支持(第6章);第7、8章主要涉及安全的相关内容,包括传输安全、授权与审核;第9章全景展示WCF服务端和客户端的运行时框架,以及在此基础上的所有扩展可能;最后一章为你带来WCF4.0几个独立的新特性。 编辑推荐 《WCF全面解析(套装上下册)》不仅适合尚未接触过WCF,希望尽快入门并进行深入研究的开发人员使用,同样也适合对WCF有一定了解的开发设计人员和架构师阅读。相信不同层次的读者都能从此书中找到自己希望了解的部分。 《WCF全面解析(套装上下册)》的内容不仅适合尚未接触过WCF,希望尽快入门并进行深入研究的开发人员,同样适合对WCF具有一定了解的开发设计人员和架构师。相信不同层次的读者都能从本书中找到自己希望了解的部分。阅读本书的读者需要对.NET,包括对C#和.NET Framework具有一定的了解。如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。 名人推荐我经历了COM时代,一直把Don Box的《COMM本质论》奉为我的指路明灯。能把SOA机理和WCF这种特定厂商实现的技术讲得如《COM本质论》一样完美透彻的,那必属Artech这本经过自己深研、实践而著的心血结晶——《WCF全面解析》。如果你想成为SOAWCF方面的专家,那么这本书就是你的最好法宝。想想你作为专家而获得的回报,那么你对这本书购买所付出的,简直是太值了。 ——《走出软件作坊》 作者 明源软件CTO 阿朱 首先,金楠是—位工作在一线的优秀的WCF技术人员,这符合我对阅读技术图书的第一个要求和期待。其次,金楠的写作文笔、专业责任也给人以充分信任,这在金楠的文字中读者可以体会。这本《WCF全面解析》全面剖析了构建WCF应用所需要的各方面技术,剥丝抽茧,由浅入深,也是我非常欣赏的技术讲述方式。我相信《WCF全面解析》—书是搞WCF朋友的案头必备。 ——祝成科技与Boolan.com创始人.NET技术专家 李建忠 知识全面、论述准确、逻辑严密是本书的特点。这是一本各层次开发人员都可以从中受益的书:对于初、中级开发人员,它可以帮助你获得WCF全方位的知识,系统地梳理WCF的知识结构,提升动手实践能力;对于高级开发人员,它既可以有效弥补你WCF相关知识中的盲点,又可以让你在自己熟悉的知识点上领略作者的看法和理解。 ——资深架构师 曲春雨 作者简介蒋金楠,网名Artech,现就职于某知名软件公司担任高级软件顾问。连续5届微软MVP(最有价值专家),同时也是少数的双料MVP(Solutions Architecture+Connected System)之一。国内较早接触WCF的人之一,2007年2月起在个人博客(http://www.cnblogs.com/artech)上发表超过两百篇深入介绍WCF的文章,成为了目前国内WCF在线资料的主要来源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值