
為便于上層訪問各數據服務,一些程序員會將每個服務都定位為單例,或許會習慣性的命名為XxxManager服務間的應用,如服務A依賴服務B提供數據,不假思索的使用BSerivice.Instance.Xxx()獲取數據對于小型項目,這樣做無可厚非,隨著軟件的復雜度的提升,這樣的結構難免會造成維護上的苦難。過多全局實例,服務間的強耦合,自然散發出不佳的味道那么如何改善,考慮如下兩點1、我不需要每一個服務都是單例類型2、我不希望各個服務之間嚴重耦合,最好以接口來獲取服務
僅存在一個單例類型ServicesManager,其組合各Service實例,上層直接以ServicesManager.Instance.XxxService獲取接口類型的服務對象那么如何降低服務間的耦合呢,見下圖
ServicesManger實現System.IServicePRovider接口,實現GetService方法,以作為服務提供者組合一個集合類型用作容器,字典_serviceMap,key為Type,value為service實例整體代碼大致如下    class ServicesManager : IServiceProvider    {        private static readonly ServicesManager INSTANCE = new ServicesManager();         public static ServicesManager Instance        {            get { return INSTANCE; }        }         private readonly Dictionary<Type, object> _serviceMap = new Dictionary<Type, object>();         public void AddService<T>(T service)        {            _serviceMap.Add(typeof(T), service);        }         public object GetService(Type serviceType)        {            return _serviceMap[serviceType];        }         public void Init()        {            UserCenterService userCenterService = new UserCenterService(this);            userCenterService.Init();            AddService<IUserCenterService>(userCenterService);            // ...        }    }在Init方法中依次初始化各個Service對象,構造方法中注意傳遞this參數(將最為服務提供者),通過AddService泛型方法將各實例添加到容器中每個Service均從抽象類型ServiceBase派生,基類ServiceBase維護一個IServiceProvider類型的字段_serviceProvider,引用實際的ServicesManager對象ServiceBase的實現大致如下    abstract class ServiceBase    {        private readonly IServiceProvider _serviceProvider;         protected ServerServiceBase(IServiceProvider serviceProvider)        {            _serviceProvider = serviceProvider;        }         protected T GetService<T>() where T : class        {            return _serviceProvider.GetService(typeof(T)) as T;        }    }在各Service內部,可以使用方式如下獲取其他Service實例var realtimeDataService = GetService<IRealtimeDataService>();realtimeDataService.xxxx
新聞熱點
疑難解答