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 中,用来创建。
浙公网安备 33010602011771号