本文将介绍以WCF开发项目为主的架构设计,主要从类库的分类和代码的结构。
下面将以一个WCF实例做具体的介绍。此项目底层是一个Windows Service,WCF服务Hosted在此Windows Service上,WCF向外暴露REST接口供第三方调用,仅为单向通讯。
项目的目录结构如下图:
项目介绍:
***CentralService:
Windows service 项目,它是一个windows service的壳,同时定义关于此服务的权限、介绍、名称等内容,里面会调用OnStart和OnStop事件,分别关联Windows服务的启动和停止事件。具体的工作在下面的***StartEngine项目中,之所以分离开有以下两方面原因:
1.为方便调试,除在Windows服务中可以启动整个程序,一般会新建一个Console程序启动整个程序以便调试,所以启动程序最好是一个操作单元(unit,即***StartEngine项目)
2.OnStart和OnStop默认有一个超时时间(timeout),所以在启动服务时为了避免不超时一般采用另起一个新线程启动整个程序,单独做一个操作单元会很方便新线程调用
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using ***.***.Remote; using log4net; namespace ***CentralService { public partial class ***CentralService : ServiceBase { public ***CentralService() { InitializeComponent(); if(!System.Diagnostics.EventLog.SourceExists("***CentralServiceSource")) { System.Diagnostics.EventLog.CreateEventSource("***CentralServiceSource", "***CentralServiceLog"); } eventLog1.Source = "***CentralServiceSource"; eventLog1.Log = "***CentralServiceLog"; } private ILog _log = LogManager.GetLogger(typeof (***CentralService)); protected override void OnStart(string[] args) { eventLog1.WriteEntry("In OnStart ***CentralService."); _log.Info("In OnStart ***CentralService."); Thread thread = new Thread(delegate() { CentralServiceEngine.StartService(); }); thread.Start(); } protected override void OnStop() { eventLog1.WriteEntry("In onStop ***CentralService."); _log.Info("In onStop ***CentralService."); Thread thread = new Thread(delegate() { CentralServiceEngine.StopService(); }); thread.Start(); } } }