public static Dns GetInstance <T>(string resolver) where T : Dns { Dns instance; try { instance = DoGetInstance(typeof(T), resolver); } catch (Exception e) { Logger.GetInstance(typeof(Dns)).Fatal("Instance initialization error " + e); Logger.GetInstance(typeof(Dns)).Info("Initializing " + typeof(DefaultDns).FullName + "..."); instance = new DefaultDns(resolver); } return(instance); }
private static Dns DoGetInstance(Type type, string resolver) { if (type == null || resolver == null) { throw new ArgumentException("Invalid arguments to get " + typeof(Dns).Name + " instance"); } var key = type.FullName + "_" + resolver; Dns instance = null; if (Instances.ContainsKey(key)) { instance = Instances[key]; } if (instance == null) { Logger.GetInstance(typeof(Dns)).Info("Initializing " + key + "..."); var constructor = type.GetConstructor(new[] { typeof(string) }); if (constructor != null) { instance = (Dns)constructor.Invoke(new object[] { resolver }); } } if (instance == null) { Logger.GetInstance(typeof(Dns)).Info("Initializing " + typeof(DefaultDns).FullName + "[" + resolver + "]..."); instance = new DefaultDns(resolver); } lock (InstancesLock) { if (!Instances.ContainsKey(key)) { Instances.Add(key, instance); } } return(instance); }