zoukankan      html  css  js  c++  java
  • WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)

    WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)

    WinForm企业应用框架设计【二】团队内部的约定和客户端按约定识别WCF服务

    WinForm企业应用框架设计【三】框架窗体设计;动态创建菜单;

    WinForm企业应用框架设计【四】动态创建业务窗体

    WinForm企业应用框架设计【五】系统登录以及身份验证+源码

    先来张图片!我们这个系列就是要做一个这样的框架! 

     

    我曾写过几个“系列”的东西,如 PL/SQL学习笔记 ;T-SQL学习笔记(这是CSDN的精华帖); jquery框架分析

    jquery框架分析写了一篇就被我送进了“净身房”成了“太监”

     园子里也有很多朋友写“系列文章”,写着写着就太监了;

    我对此深表理解!尤其是做项目的人~身不由己啊!

    顺便问一下haibindev 您的《c# 实现p2p文件分享与传输系统》 完结了吗?我还等着看呢~

    好了言归正传

    我承诺这个系列将包含以下这些内容

    1.一个简单的面向服务编程的框架的搭建

    2.动态创建WCF(no svc!no serviceActivations!)

    3.客户端根据约定自动识别WCF服务

    4.客户端框架窗体(如上图所示)

    5.动态菜单与动态业务窗体

    如果反响不错~我将加入如下内容

    6.组织架构和人事管理

    7.角色权限控制

    8.自定义打包工具

    好吧~真正的言归正传

    一:界限划分

    如图所示,几个程序集的含义如下:

    XL.Client 【客户端程序】

    XL.DataAccess  【数据库访问层】

    XL.Models  【实体层】

    XL.Service 【WCF服务层】

    XL.ServiceAPI 【服务接口】(全部是接口)

    XL.Setup 【安装包】

    这就是一个典型的CS程序的程序集列表

    客户端中:

    XL.Client 将引用 XL.Models和XL.ServiceAPI

    服务端 中:

    XL.Service 将引用 XL.Models和XL.ServiceAPI和XL.DataAccess

    实体层中各个实体的实例携带着数据,像JJ一样不停的穿梭于客户端和服务端之间-_-!

    【上句话在2011-12-2修改】

    XL.Service中针对每个业务都将有一个WCF服务与之对应,

    每个服务类型都实现了XL.ServiceAPI中的一个接口

    XL.Client中通过XL.ServiceAPI中的这些接口调用服务

    XL.DataAccess 负责持久化数据和从数据库中取数

    二:动态创建WCF服务

     在Application_Start中加入如下代码

            protected void Application_Start(object sender, EventArgs e)
            {
                ServiceRegister.RegisterAllService();
            }
    

    ServiceRegister的代码如下:

        /// <summary>
        /// 为了进一步拓展,才定义了自己的ServiceHostFactory
        /// </summary>
        public class MyServiceHostFactory : ServiceHostFactory
        {
            protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
            {
                var result = base.CreateServiceHost(serviceType, baseAddresses);
                return result;
            }
        }
        public static class ServiceRegister
        {
            private static ServiceHostFactory wshf;
            /// <summary>
            /// 静态构造函数只执行一次
            /// </summary>
            static ServiceRegister()
            {
                wshf = new MyServiceHostFactory();
            }
            /// <summary>
            /// 通过反射注册服务
            /// </summary>
            public static void RegisterAllService()
            {
                
                var ass = (typeof(ServiceRegister)).Assembly;
                var ts = ass.GetTypes();
                foreach (var t in ts)
                {
                    //约定:类型名以Service结尾的为WCF服务类型
                    if (t.Name.EndsWith("Service"))
                    {
                        var serviceName = t.FullName.Substring("XL.Service.".Length);
                        serviceName = serviceName.Replace(".", "-");
                        var sr = new ServiceRoute(serviceName, wshf, t);
                        RouteTable.Routes.Add(sr);
                    }
                }
            }
        }
    

    【上面的代码2011-11-30 23.00.00修改】

    【上面的代码2011-12-03 23.34.00修改】

    好吧,我承认这是动态注册WCF服务的核心代码

    想动态创建WCF服务ServiceHostFactory是必不可少的~

    (服务的工厂嘛~看名字就知道啦~)

    其次我们循环创建了ServiceRoute的实例

    ServiceRoute是“允许创建支持 REST 方案的 HTTP 服务路由”

    (我们动态创建的服务路由只支持HTTP的绑定,也是这里造成的)

    然后把这些服务路由都存到RouteTable中,放到RouteTable中只是注册了服务路由,并没有启动服务

    但当客户端试图绑定这个服务的时候,服务会自行启动!it's amazing!

    在这个代码中,我们约定以Service结尾的类型就是WCF服务类型

    亲~这是约定优于配置的原则哦~

    当然我们应该为特例留下生存空间,我这里没有做,亲,你自己实现吧

    这虽然是核心代码,但没有配置文件也是不行的

      <system.web>
        <compilation debug="true" targetFramework="4.0"/>    
      </system.web>
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />    
      </system.serviceModel>
    

    接着在看看WCF服务的代码

        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
        public class MenuService:IMenu
        {
            MenuDA da = new MenuDA();
            public List<MenuModel> GetAllMenu()
            {
                var result = da.GetAllModels();
                return result;
            }
            public bool EditMenu(MenuModel target)
            {
                var result = da.Update(target);
                return result;
            }
        }
    

    AspNetCompatibilityRequirements的属性是指这个服务应在asp.net兼容模式下运行

    基于IIS的WCF有两种模式,一种是ASP.NET并行,一种是ASP.NET兼容;

    这些内容超出了咱们这篇文章的范畴了~就不多说了

    ServiceBehavior的属性要求把错误发送给客户端,也可以在这里定义其他的服务端行为

    类里面的MenuDA就是数据库访问层的代码了~我就不贴出来了

    好下面看看这个服务的接口IMenu

        [ServiceContract]    
        public interface IMenu
        {
            [OperationContract]
            List<MenuModel> GetAllMenu();
            [OperationContract]
            bool EditMenu(MenuModel target);
        }
    

    服务契约和操作契约的属性标记一如往常,就不多说了

    这些工作做完之后;发布到IIS下;

    http://localhost/XL.Service/[YourType]Service

    这就是一个服务;

    如果XL.Service程序集下有多个服务类型的话,将产生出多个服务。

    好吧~到此为止

    ------

    下一节我们就说怎么动态识别这些服务~

    另外有个朋友让我帮着做一个打包工具

    这个工具能够自动识别客户端有没有.net环境,如果没有,将先安装.net framework,再安装他的程序,我也打算写出来后放到博客上

    相对于下一节的内容来说~

    您更希望我先写哪个内容呢??

    期待朋友们的回复!

    -----

    另外

    在很早之前与ArtechFrank Xu Lei交流过NO SVC的技术细节~

    在此表示感谢!两位都是WCF领域的大牛

  • 相关阅读:
    String ,StringBuilder, StringBuffer
    apt-get方式删除软件
    curl命令的使用
    maven自动部署测试Web应用
    几个重要的maven命令
    linux中默认jdk的配置
    登录注册的页面制作
    运用php做投票题,例题
    复选框式查询 例题租房子
    会话用法 和留言板例题
  • 原文地址:https://www.cnblogs.com/liulun/p/2268337.html
Copyright © 2011-2022 走看看