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;

            }

        }

    }

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

  1. LCLFramework框架之Plugin模式

    插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...

  2. LCLFramework框架之Repository模式

    Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...

  3. LCLFramework框架 1.1 Pre-Alpha 源码公布

    使用开发框架的好处:1.框架在技术上为软件系统提供了完整的模式实践2.框架为团队提供了合理可行的软件开发过程模式3.框架的应用大大提高了团队的开发效率,团队只需要关注与领域相关的业务实现,而无需关注具 ...

  4. 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统

    文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...

  5. EF框架之三种模式

    使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...

  6. LCLFramework框架之数据门户

    LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端.    LCLFramework框架之数据门户设计代码 数 ...

  7. LCLFramework框架之IOC

    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...

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

    转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...

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

    1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...

随机推荐

  1. UIScrollView滚动视图

    一.基本知识 1.初始化 UIScrollView #import "ViewController.h" #define WIDTH[[UIScreen mainScreen]bo ...

  2. UI创意求助:手机贪吃蛇游戏方向控制键设计

    继上一片博文<做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)>之后,尝试做一个手机版本,大部分的功能都已经实现了.但在贪吃蛇的方向控制设计上一直不太满意.由于手机界面的大 ...

  3. OWIN的理解和实践(二) – Host和Server的开发

    对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用. 今天我们先针对Host和Server来实现一个简单的 ...

  4. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

  5. 第十七章:android解析JSON

    一.解析JSON数据: 首先引入包import org.json.JSONObject;(android sdk 14以后应该自带了 ) Android端的程序解析JSON和JSON数组: packa ...

  6. 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名

    开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...

  7. 2014年团队博客TOP10

    2014年通过这个团队博客,葡萄城共输出了51篇原创技术博客(含翻译),总阅读超过9万人次,约有1万人次是通过RSS订阅方式阅读,总评论超过500人次. 这里我们通过阅读排序,选出2014年团队博客T ...

  8. paip.前端加载时间分析之道优化最佳实践

    paip.前端加载时间分析之道优化最佳实践 1.另存为 ,查看文件尺寸..和图片. 2.view the 另存为的htm静态的文件单个的加载,看时间...可以排除编程语言的问题and 数据库.. ## ...

  9. 公钥,私钥,SSL(讲的很生动) (转) 对称加密、非对称加密初探

    最近开始做消息推送,有不少概念性的东西需要知道,首先应该了解的是密钥.这片文章很清晰的讲解了对称密钥.非对称密钥.ssl的知识. 原文地址:http://chenling1018.blog.163.c ...

  10. 学javascript必须要知道的事

    第一:变量声明 在使用javascript时使用变量时首先做的是声明变量,变量声明的关键字是var. 例子: var i; var sum; 也可以多个变量声明: var i,sum; 还可以在声明时 ...