
为便于上层访问各数据服务,一些程序员会将每个服务都定位为单例,或许会习惯性的命名为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
新闻热点
疑难解答