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);
}
} }

最新文章

  1. Redis数据类型介绍
  2. Python之路,day11-Python基础
  3. Dynamic V Strongly Typed Views
  4. SonarQube-5.6.3 代码分析平台搭建使用
  5. 【移动适配】一个像素的border怎么实现
  6. wenti
  7. style在进行图形绘制前,要设置好绘图的样式
  8. Java Map遍历方式的选择
  9. ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程
  10. node.js BootStrap安装
  11. [再做01背包] POJ 3624 Charm Bracelet
  12. Windows多线程
  13. HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP
  14. android:minSdkVersion 之我见
  15. 杭州蓝松科技推出的安卓端的USB转串口调试助手, 欢迎下载使用
  16. BaseServlet的编写
  17. mysql常用命令行操作(一):登陆、退出、查看端口、修改密码、刷新
  18. ArcEngine临时数据存储 创建内存工作空间
  19. antd在webpack里面的配置
  20. 安卓开发_数据存储技术_sqlite

热门文章

  1. live555库中的testH264VideoStreamer实例
  2. [译]reset, checkout和revert
  3. tyvj1106 登山
  4. cf723b Text Document Analysis
  5. [Scala] Scala基础知识
  6. Discuzx系统 CSS 编码规范,CSS属性书写顺序
  7. getcwd()和dirname(__FILE__)的区别
  8. C和指针 第三章 链接属性 extern、internal、none
  9. 【转】MVC中处理Json和JS中处理Json对象
  10. 双系统Ubuntu分区扩容过程记录