1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace ServiceLocator
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 var conObj = (IConsoleIml)ServiceLocator.Loctory.GetServiceByType(typeof(IConsoleIml));
14 conObj.Console("123");
15 Console.Read();
16 }
17 }
18
19 public sealed class ServiceLocator
20 {
21 private static readonly ServiceLocator locator = new ServiceLocator();
22 private static readonly InitialContext initialContext = new InitialContext();
23 public object GetServiceByType(Type serviceType)
24 {
25 return initialContext.GetService(serviceType);
26 }
27 public static ServiceLocator Loctory { get { return locator; } }
28 }
29 public class InitialContext
30 {
31 public Dictionary<Type, ServiceFactoryBase> dic = new Dictionary<Type, ServiceFactoryBase>();
32 public InitialContext()
33 {
34 foreach (var item in this.GetType().Assembly.GetExportedTypes())
35 {
36 if (item.IsSubclassOf(typeof(ServiceFactoryBase)))
37 {
38 var factory = (ServiceFactoryBase)Activator.CreateInstance(item);
39 dic.Add(factory.ServiceType, factory);
40 }
41 }
42 }
43
44 public object GetService(Type ServiceType)
45 {
46 var serviceFactory = dic[ServiceType];
47 if (serviceFactory != null)
48 return serviceFactory.GetService();
49 throw new InvalidOperationException();
50 }
51 }
52 public abstract class ServiceFactoryBase
53 {
54 private object serviceIml = null;
55 public object GetService()
56 {
57 if (serviceIml == null)
58 {
59 serviceIml = this.DoGetservice();
60 }
61 return serviceIml;
62 }
63 protected abstract object DoGetservice();
64 public abstract Type ServiceType { get; }
65 }
66 public class ConsoleFactory : ServiceFactoryBase
67 {
68 protected override object DoGetservice()
69 {
70 return new ConsoleIml();
71 }
72
73 public override Type ServiceType
74 {
75 get { return typeof(IConsoleIml); }
76 }
77 }
78 public interface IConsoleIml
79 {
80 void Console(string content);
81 }
82 public class ConsoleIml : IConsoleIml
83 {
84 public void Console(string content)
85 {
86 System.Console.WriteLine(content);
87 }
88 }
89
90 }