Service Locator 服务定位模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ServiceLocator
{
class Program
{
static void Main(string[] args)
{
var conObj = (IConsoleIml)ServiceLocator.Loctory.GetServiceByType(typeof(IConsoleIml));
conObj.Console("");
Console.Read();
}
} public sealed class ServiceLocator
{
private static readonly ServiceLocator locator = new ServiceLocator();
private static readonly InitialContext initialContext = new InitialContext();
public object GetServiceByType(Type serviceType)
{
return initialContext.GetService(serviceType);
}
public static ServiceLocator Loctory { get { return locator; } }
}
public class InitialContext
{
public Dictionary<Type, ServiceFactoryBase> dic = new Dictionary<Type, ServiceFactoryBase>();
public InitialContext()
{
foreach (var item in this.GetType().Assembly.GetExportedTypes())
{
if (item.IsSubclassOf(typeof(ServiceFactoryBase)))
{
var factory = (ServiceFactoryBase)Activator.CreateInstance(item);
dic.Add(factory.ServiceType, factory);
}
}
} public object GetService(Type ServiceType)
{
var serviceFactory = dic[ServiceType];
if (serviceFactory != null)
return serviceFactory.GetService();
throw new InvalidOperationException();
}
}
public abstract class ServiceFactoryBase
{
private object serviceIml = null;
public object GetService()
{
if (serviceIml == null)
{
serviceIml = this.DoGetservice();
}
return serviceIml;
}
protected abstract object DoGetservice();
public abstract Type ServiceType { get; }
}
public class ConsoleFactory : ServiceFactoryBase
{
protected override object DoGetservice()
{
return new ConsoleIml();
} public override Type ServiceType
{
get { return typeof(IConsoleIml); }
}
}
public interface IConsoleIml
{
void Console(string content);
}
public class ConsoleIml : IConsoleIml
{
public void Console(string content)
{
System.Console.WriteLine(content);
}
} }
Service Locator 服务定位模式的更多相关文章
- PHP中应用Service Locator服务定位及单例模式
单例模式将一个对象实例化后,放在静态变量中,供程序调用. 服务定位(ServiceLocator)就是对象工场Factory,调用者对象直接调用Service Locator,与被调用对象减轻了依赖关 ...
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
- 16_游戏编程模式ServiceLocator 服务定位
####简单说,就是某个系统作为一个服务,对全局系统可见. Service Locator (服务定位) ``` //简单粗暴的代码, 使用声音系统 // Use a static class? Au ...
- [Design Pattern] Service Locator Pattern 简单案例
Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...
- Service Locator 模式
什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...
- .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator
本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...
- Service Locator Pattern 服务定位
https://www.geeksforgeeks.org/service-locator-pattern/ Service Locator Pattern Last Updated: 06-03-2 ...
- 服务定位器(Service Locator)
服务定位器(Service Locator) 跟DI容器类似,引入Service Locator目的也在于解耦.有许多成熟的设计模式也可用于解耦,但在Web应用上, Service Locator绝对 ...
- 避免在ASP.NET Core中使用服务定位器模式
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...
随机推荐
- ssh保持链接
修改/etc/ssh/sshd_config配置文件 ClientAliveInterval 300(默认为0), 参数的是意思是每5分钟,服务器向客户端发一个消息,用于保持连接,使用service ...
- HTML5的属性
一.全局属性 1.class属性 class属性对元素指定CSS类选择器 <!doctype html> <html> <meta charset="utf-8 ...
- ETL简介
1.ETL的定义 ETL分别是“Extract”.“ Transform” .“Load”三个单词的首字母缩写也就是“抽取”.“转换”.“装载”,但我们日常往往简称其为数据抽取. ETL是BI/DW( ...
- bzoj1441 MIN
Description 给出n个数(A1…An)现求一组整数序列(X1…Xn)使得S=A1*X1+…An*Xn>0,且S的值最小 Input 第一行给出数字N,代表有N个数 下面一行给出N个数 ...
- 妈妈再也不用担心别人问我是否真正用过redis了
1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...
- oracle查询以当前年份为准的近些年数据
今天在工作中遇到了一个查询近几年数据的问题,oracle学的比较渣渣,学习了一下. 举个例子: 比如说员工入职,我想看这个公司的员工入职情况,然后做一个趋势统计表. 以当前年份为准,查看近5年的情况趋 ...
- espcms简约版的表单,提示页,搜索列表页
模板/lib/form.html <script type="text/javascript" src="{%$rootdir%}js/My97DatePicker ...
- cf593d
题意:给出一个有n(n<=200000)的树形图,每条边有一个权值.有两种操作,1是将一个边的权值变小, 2是给定两点a,b和一个值y,用y(long long范围内)依次除以两点之间的路径上的 ...
- ffmpeg-20160831-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- server2003中看不到网上邻居内容,其他电脑无法通过计算机名和IP访问本计算机(但网上邻居中可访问到)
现象1:server2003中看不到网上邻居内容,查看工作组计算机看到的是空列表, 现象2:其他电脑无法通过计算机名和IP访问本计算机(但网上邻居中可访问到) 访问提示:--Windows 200 ...