Service Locator 服务定位模式
2024-10-19 02:21:24
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);
}
} }
最新文章
- Redis数据类型介绍
- Python之路,day11-Python基础
- Dynamic V Strongly Typed Views
- SonarQube-5.6.3 代码分析平台搭建使用
- 【移动适配】一个像素的border怎么实现
- wenti
- style在进行图形绘制前,要设置好绘图的样式
- Java Map遍历方式的选择
- ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程
- node.js BootStrap安装
- [再做01背包] POJ 3624 Charm Bracelet
- Windows多线程
- HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP
- android:minSdkVersion 之我见
- 杭州蓝松科技推出的安卓端的USB转串口调试助手, 欢迎下载使用
- BaseServlet的编写
- mysql常用命令行操作(一):登陆、退出、查看端口、修改密码、刷新
- ArcEngine临时数据存储 创建内存工作空间
- antd在webpack里面的配置
- 安卓开发_数据存储技术_sqlite
热门文章
- live555库中的testH264VideoStreamer实例
- [译]reset, checkout和revert
- tyvj1106 登山
- cf723b Text Document Analysis
- [Scala] Scala基础知识
- Discuzx系统 CSS 编码规范,CSS属性书写顺序
- getcwd()和dirname(__FILE__)的区别
- C和指针 第三章 链接属性 extern、internal、none
- 【转】MVC中处理Json和JS中处理Json对象
- 双系统Ubuntu分区扩容过程记录