• Service Locator 服务定位模式


     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 }
  • 相关阅读:
    ORACLE同义词
    eclipse如何检出项目的jar包
    2020-04-03
    十大经典排序算法
    2020-03-30
    world文档设置表格自定义序列
    2020面试记录
    java如何用一个循环实现两个有序数组合并成一个有序数组
    2020-1-8
    好物推荐之抽纸
  • 原文地址:https://www.cnblogs.com/since87/p/3541827.html
Copyright © 2020-2023  润新知