LCLFramework框架之Service模式
Service模式介绍
领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物。这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象共同完成这个操作或动作。如果强行将这些操作职责分配给任何一个对象,则被分配的对象就是承担一些不该承担的职责,从而会导致对象的职责不明确很混乱。但是基于类的面向对象语言规定任何属性或行为都必须放在对象里面。
所以我们需要寻找一种新的模式来表示这种跨多个对象的操作,DDD认为服务是一个很自然的范式用来对应这种跨多个对象的操作,所以就有了领域服务这个模式。
领域服务职责
- 领域服务没有状态只有行为
- 领域服务是无状态的
- 避免领域逻辑泄露到应用层
- 领域服务具有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模式的更多相关文章
- LCLFramework框架之Plugin模式
插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...
- LCLFramework框架之Repository模式
Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...
- LCLFramework框架 1.1 Pre-Alpha 源码公布
使用开发框架的好处:1.框架在技术上为软件系统提供了完整的模式实践2.框架为团队提供了合理可行的软件开发过程模式3.框架的应用大大提高了团队的开发效率,团队只需要关注与领域相关的业务实现,而无需关注具 ...
- 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统
文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...
- EF框架之三种模式
使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...
- LCLFramework框架之数据门户
LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端. LCLFramework框架之数据门户设计代码 数 ...
- LCLFramework框架之IOC
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...
- web开发中的MVC框架与django框架的MTV模式
1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...
随机推荐
- window环境下glog的安装
window环境下glog的安装 分类: c++2014-09-23 14:12 32人阅读 评论(0) 收藏 举报 下载后解压,利用Visual Studio打开google-glog.sln.生成 ...
- 基于VC的声音文件操作(三)
(四)VC中相关的操作 1.mmioOpen 打开一个文件 Syntax MMIO mmioOpen( LPTSTR szFilename, LPMMIOINFO lpmmioinfo, DWORD ...
- linux内核调优详解
cat > /etc/sysctl.conf << EOF net.ipv4.ip_forward = net.ipv4.conf.all.rp_filter = net.ipv4. ...
- 《Diagnostic use of facial image analysis software in endocrine and genetic disorders: review, current results and future perspectives》学习笔记
<使用面部图像分析软件诊断内分泌和遗传疾病:回顾,当前研究结果以及未来展望> Abstract 库欣综合征(CS)和肢端肥大症普遍是在发病后几年才能被诊断出的内分泌疾病.现在需要新的诊断方 ...
- Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...
- 解决nginx反向代理缓存不起作用的问题
昨天尝试用nginx搭建nuget镜像服务器,镜像服务器需要两个功能:1)反向代理:2)内容缓存. 用nginx做反向代理,配置非常简单,只需在/etc/nginx/nginx.conf中添加一个包含 ...
- codepage IMLangCodePages
http://baike.baidu.com/link?url=78DSTGAri8dvHNLQ03rThSKieJqhFwFWL4sQMao6cfaRSOUWN88QVBwmSJPCZch0vf ...
- RSA密钥的跨平台通用
RSA使用public key加密,用private key解密(签名相反,使用private key签名,用public key验证签名).比如我跟合作方D之间的数据传输,我使用D提供给我的publ ...
- 到底是 const 还是 static readonly
真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试验. 程序集内的常量 现在我们建立一个程序,里面有一个MyCl ...
- Java Web指导方向
第一阶段 第二阶段 第三阶段 第四阶段 第五阶段 第六阶段 第七阶段 第一阶段:Java程序员 技术名称 内 容 说明 Java语法基础 基本语法.数组.类.继承.多态 ...