导航

08-001 Hosting 之 ServerManager : IServerManager

Posted on 2015-04-07 10:12  DotNet1010  阅读(215)  评论(0)    收藏  举报

接口代码:

    public interface IServerManager
    {
        IServerFactory GetServerFactory(string serverName);
    }
   public interface IServerFactory
    {
        IServerInformation Initialize(IConfiguration configuration);
        IDisposable Start(IServerInformation serverInformation, Func<object, Task> application);
    }

 这个接口的实现类是: ServerManager  是有依赖注入来创建的:

  public class ServerManager : IServerManager
    {
        private readonly IServiceProvider _services;

		// 还记得:_table.Add(typeof(IServiceProvider), new ServiceProviderService()); 吗?
		// 把调用的 ServierProvider 传进去
		public ServerManager(IServiceProvider services)
        {
            _services = services;
        }
}

 依赖注入中默认添加有:_table.Add(typeof(IServiceProvider), new ServiceProviderService());

这里就是把ServiceProvider 传入进去。

再看一下 GetServerFactory Code:

                 /// <summary>
		///  _serverManager.GetServerFactory(context.ServerName);   context.ServerName = config.Get("server")
		/// </summary>
        public IServerFactory GetServerFactory(string serverFactoryIdentifier)
        {
            if (string.IsNullOrEmpty(serverFactoryIdentifier))
            {
                throw new ArgumentException(string.Empty, "serverFactoryIdentifier");
            }

			// 逗号, 分隔 前面是类型名字 后面是程序集 比如这样的格式: ClassLibrary1.Class1,ClassLibrary1
			var nameParts = HostingUtilities.SplitTypeName(serverFactoryIdentifier);
            string typeName = nameParts.Item1;
            string assemblyName = nameParts.Item2;

            var assembly = Assembly.Load(new AssemblyName(assemblyName));
            if (assembly == null)
            {
                throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName));
            }

            Type type = null;
            Type interfaceInfo;
            if (string.IsNullOrEmpty(typeName))
            {
                foreach (var typeInfo in assembly.DefinedTypes)
                {
                    interfaceInfo = typeInfo.ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory)));
                    if (interfaceInfo != null)
                    {
                        type = typeInfo.AsType();
                    }
                }

                if (type == null)
                {
                    throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "<null>"));
                }
            }
            else
            {
                type = assembly.GetType(typeName);

                if (type == null)
                {
                    throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "<null>"));
                }

                interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory)));

                if (interfaceInfo == null)
                {
                    throw new Exception("TODO: IServerFactory interface not found");
                }
            }

			// 类型 必须实现接口 IServerFactory
			return (IServerFactory)ActivatorUtilities.GetServiceOrCreateInstance(_services, type);
        }

 实现 IServerFactory 的类是用户或者第三方应有程序自己创建的,类的信息配置在Configuration 中,用来创建。