LCLFramework框架之Service模式

Service模式介绍


领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物。这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象共同完成这个操作或动作。如果强行将这些操作职责分配给任何一个对象,则被分配的对象就是承担一些不该承担的职责,从而会导致对象的职责不明确很混乱。但是基于类的面向对象语言规定任何属性或行为都必须放在对象里面。

所以我们需要寻找一种新的模式来表示这种跨多个对象的操作,DDD认为服务是一个很自然的范式用来对应这种跨多个对象的操作,所以就有了领域服务这个模式。

领域服务职责


  1. 领域服务没有状态只有行为

  2. 领域服务是无状态的
  3. 避免领域逻辑泄露到应用层
  4. 领域服务具有Fa?ade的功能

说到领域服务,还需要提一下软件中一般有三种服务:应用层服务、领域服务、基础服务。

LCLFramework框架之Service设计


LCLFramework框架之Service模式设计代码


    public interface IDomainService

    {

        void Invoke();

    }

    public abstract class DomainService : IDomainService

    {

        protected abstract void Execute();

        public void Invoke()

        {

            this.Execute(context);

        }

    }

    /// <summary>

    /// 服务命名规范:

    ///    1:服务名称Service

    ///    2:服务名称Service_V10002

    /// </summary>

    [DebuggerDisplay("Count = {Count}")]

    public class DomainServiceLocator

    {

        public static readonly ServiceLocator Instance = new ServiceLocator();

        /// <summary>

        /// 内存保存的服务名称规范

        ///   1:服务名称

        ///   2:服务名称_V10002

        /// </summary>

        private static Dictionary<string, Service> _allServices = new Dictionary<string, Service>(100);

        public ServiceLocator()

        {

        }

        public void TryAssemblyAddServices()

        {

            try

            {

                Assembly assembly = Assembly.GetExecutingAssembly();

                var pluginTypes = assembly.GetTypes().Where(p => p.BaseType == typeof(Service));

                foreach (var type in pluginTypes)

                {

                    TryAddService(type);

                }

            }

            catch

            {

                try

                {

                    _allServices = new Dictionary<string, Service>(100);

                    TryAddService();

                }

                catch (Exception ex)

                {

                    LogManage.AddErrorLog(ex, "服务初始化错误......");

                }

            }

        }

        public void TryAddService(Type serviceType)

        {

            var ser = Activator.CreateInstance(serviceType, true) as Service;

            string serviceName = serviceType.Name;

            serviceName = serviceName.Replace("Service", "");

            serviceName = serviceName.ToLower();

            _allServices.Add(serviceName, ser);

        }

        public Service FindImpl(string contractType)

        {

            if (string.IsNullOrWhiteSpace(contractType))

            {

                return null;

            }

            Service list = null;

            if (_allServices.TryGetValue(contractType.ToLower(), out list))

            {

                return list;

            }

            return null;

        }

        public Service FindImpl(string contractType, string version)

        {

            if (string.IsNullOrWhiteSpace(contractType))

            {

                return null;

            }

            // 服务名称_V10002

            string sernamever = contractType;

            if (string.IsNullOrWhiteSpace(version))

            {

                return FindImpl(sernamever);

            }

            else

            {

                sernamever = contractType.ToLower() + "_V" + version;

            }

            Service list = null;

            if (_allServices.TryGetValue(sernamever, out list))

            {

                return list;

            }

            else

            {

                // 如果没有找到当前版本,就还回默认版本。

                return FindImpl(sernamever);

            }

        }

        public int Count

        {

            get { return _allServices.Count; }

        }

    }

LCLFramework框架之Service使用



加载服务:

public class Global : System.Web.HttpApplication 

    { 

        protected void Application_Start(object sender, EventArgs e) 

        { 

            ServiceLocator.Instance.TryAssemblyAddServices(); 

        } 

    }

创建服务:

public class FrequentService : DomainService

     {

        protected override void Execute(System.Web.HttpContext context)

        {

           //业务逻辑

        }

    }

调用服务:

public class HttpHandlerDemo: IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/plain";

            try

            {

                string sMothod = LRequest.GetString("method");

                string version = LRequest.GetString("version");

                if (!string.IsNullOrWhiteSpace(sMothod))

                {

                    context.Response.Clear();

                    var service = ServiceLocator.Instance.FindImpl(sMothod, version);

                    if (service != null)

                    {

                        service.Invoke(context);

                    }

                    else

                    {

                        LogManage.AddActionLog("系统不提供【" + sMothod + "】服务,请检查输入. ");

                    }

                }

                else

                {

                    context.Response.Write("系统需要提供服务名称.");

                }

            }

            catch (Exception ex)

            {

                LogManage.AddErrorLog(ex);

            }

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }
时间: 2024-11-10 01:13:45

LCLFramework框架之Service模式的相关文章

LCLFramework框架之Plugin模式

Plugin模式在示例中的实际目的小结一下 Plugin模式是架构模式,在设计架构时,才有参考价值: Plugin模式主要是实现单一职责的封装,和扩展应用程序: Plugin与扩展的区别 插件稍不同于扩展(extension),插件通常依赖于主应用程序的接口,有一个它们可以运行的确定的界限.扩展则通常有更少的限制,也可以提供它们自己的接口.相同的是,它们通常都用来减少主应用程序的大小.提供一些可选的功能. 这里不得不提到Mozilla Firefox 和相关软件.它们使用一个叫做Add-on的名

LCLFramework框架之Repository模式

Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式实际用途:更换.升级ORM 引擎,不影响业务逻辑: Repository模式能提高测试效率,单元测试时,用Mock对象代替实际的数据库存取,可以成倍地提高测试用例运行速度. Repository与Dal的区别 Repository是DDD中的概念,强调Repository是受Domain驱动的,Re

【.NET】EF框架之三种模式

使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. 今天老师宏观给讲了一下EF的好处,抛出为什么要用EF的问题,我们的回答仅仅是概念和技术上的浅显的认识,老师的话我并未全部理解.先来整理一下自己所认识的EF吧. Entity Framework是ORMapping的一种具体实现,那ORMapping又是什么呢?ORM--ObjectRelation Mapping,即对象关系映

LCLFramework框架之IOC

LCLFramework框架之依赖注入(IOC)职责 依赖注入(Dependency Injection,简称DI) 依赖查找(Dependency Lookup) 控制反转 LCLFramework框架之依赖注入(IOC)设计 网上有很多的IOC框架如何让用户选择自己熟悉的IOC框架了,那LCL就需要提供可扩展的IOC应该如何让框架注入自己熟悉的IOC框架呢? 下图是基本的IOC扩展契约,所有的第三方都要实现IObjectContainer契约,下图中实现了,Unity,TinyIoc两个第三

LCLFramework框架 1.1 Pre-Alpha 源码公布

LCLFramework 框架简要说明: LCL 是一个管理类软件的快速开发框架,其目标主要专注于:1. 快速开发:    DDD.界面自动生成.数据库自动生成与升级.易用的业务逻辑编写框架.2. 产品线工程:    插件化业务模块积累(内置一个权限控制插件模块).客户化二次开发.实施配置平台.3. 一套代码,可同时生成并运行 C/S.单机版.B/S 三种应用程序.    C/S版本 与 单机版 代码重用率 100%.    C/S版本 与 B/S版本 重用服务端代码(完全重用服务层以下代码.结

从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)

从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇,而神奇的东西常能勾起我的兴趣,在看过介绍它们的文章或论文之后,认为Hadoop是一项富有趣味和挑战性的技术,且它还牵扯到了一个我更加感兴趣的话题:海量数据处理. 由此,近期凡是空暇时,便在看"Hadoop","MapReduce""海量数据处理"这方面的论文.但在看论

LCLFramework框架之数据门户

LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端. LCLFramework框架之数据门户设计代码 数据门户交互实现: 1:WcfPortal 2:WebServicePortal /// <summary> /// 数据访问层执行的地点 /// </summary> public enum DataPortalLocation { /// <summary> /// 根据 LC

web开发中的MVC框架与django框架的MTV模式

有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model-View-Controller,最早由TrygveReenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式,是为了将传统的输入(input).处理(processing).输出(output)任务运用到图形化用户交互模

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we