博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)...
阅读量:7013 次
发布时间:2019-06-28

本文共 3993 字,大约阅读时间需要 13 分钟。

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

 

我曾写过几个“系列”的东西,如 ;(这是CSDN的精华帖); 

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

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

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

顺便问一下 您的《》 完结了吗?我还等着看呢~

好了言归正传

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

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的代码如下:

///     /// 为了进一步拓展,才定义了自己的ServiceHostFactory    ///     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;        ///         /// 静态构造函数只执行一次        ///         static ServiceRegister()        {            wshf = new MyServiceHostFactory();        }        ///         /// 通过反射注册服务        ///         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服务类型

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

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

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

接着在看看WCF服务的代码

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]    public class MenuService:IMenu    {        MenuDA da = new MenuDA();        public List
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
GetAllMenu(); [OperationContract] bool EditMenu(MenuModel target); }

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

 

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

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

这就是一个服务;

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

好吧~到此为止

------

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

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

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

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

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

期待朋友们的回复!

-----

另外

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

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

转载地址:http://xcqtl.baihongyu.com/

你可能感兴趣的文章
LeetCode: 103_Binary Tree Zigzag Level Order Traversal | 二叉树Zigzag层次遍历 | Medium
查看>>
JUnit单元测试中的setUpBeforeClass()、tearDownAfterClass()、setUp()、tearDown()方法小结
查看>>
Java程序猿JavaScript学习笔记(2——复制和继承财产)
查看>>
ubuntu15.10下编译安装wine1.8 rc4
查看>>
Hello,HTML 到 HTML5
查看>>
jquery获取节点的时候获取包含自己在内的HTML标签
查看>>
android之AlertDialog 点击其它区域自己主动消失
查看>>
小程序 - 提示框
查看>>
Windows 10下安装配置Caffe并支持GPU加速(修改版)
查看>>
CPU profiling
查看>>
feign调用接口session丢失解决方案
查看>>
利用 SPL 快速实现 Observer 设计模式
查看>>
本体感受和演讲能力
查看>>
Spring MVC+Ant+Tomcat+Eclipse最简单的demo
查看>>
JavaScript 对象
查看>>
UrlDecode
查看>>
Quartz.Net在windows服务中的使用
查看>>
一条直线上N个线段所覆盖的总长度
查看>>
sql server 2008学习13 触发器
查看>>
Wix学习整理(5)——安装时填写注册表
查看>>