必须填写至少10个字的日志
nnhy 编写于 2012-07-27 18:48:21
X
using System;
using System.Net.Sockets;
using NewLife.Model;
using NewLife.Net.Common;
using NewLife.Net.Proxy;
using NewLife.Net.Sockets;
using NewLife.Net.Tcp;
using NewLife.Net.Udp;
using NewLife.Reflection;

namespace NewLife.Net
{
    /// <summary>网络服务对象提供者</summary>
    public class NetService : ServiceContainer<NetService>
    {
        static NetService()
        {
            IObjectContainer container = Container;
            container.Register<IProxySession, ProxySession>()
                .Register<ISocketServer, TcpServer>(ProtocolType.Tcp)
                .Register<ISocketServer, UdpServer>(ProtocolType.Udp)
                .Register<ISocketClient, TcpClientX>(ProtocolType.Tcp)
                .Register<ISocketClient, UdpClientX>(ProtocolType.Udp)
                .Register<ISocketSession, TcpClientX>(ProtocolType.Tcp)
                .Register<ISocketSession, UdpServer>(ProtocolType.Udp)
                .Register<IStatistics, Statistics>()
                .Register<INetSession, NetSession>();
        }

        /// <summary>安装,引发静态构造函数</summary>
        public static void Install() { }

        #region 方法
        /// <summary>解析符合条件的类型</summary>
        /// <typeparam name="TInterface"></typeparam>
        /// <param name="func"></param>
        /// <returns></returns>
        public static Type ResolveType<TInterface>(Func<IObjectMap, Boolean> func)
        {
            foreach (IObjectMap item in Container.ResolveAllMaps(typeof(TInterface)))
            {
                if (func(item)) return item.ImplementType;
            }

            return null;
        }

        /// <summary>根据网络标识创建客户端并连接(对Tcp)</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public static ISocketClient CreateClient(NetUri uri)
        {
            if (uri == null) throw new ArgumentNullException("uri");

            var client = NetService.Resolve<ISocketClient>(uri.ProtocolType);
            if (uri.EndPoint != null)
            {
                client.AddressFamily = uri.EndPoint.AddressFamily;
                if (uri.ProtocolType == ProtocolType.Tcp) client.Connect(uri.EndPoint);
            }

            return client;
        }

        /// <summary>根据网络标识创建客户端会话并连接(对Tcp)</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public static ISocketSession CreateSession(NetUri uri)
        {
            if (uri == null) throw new ArgumentNullException("uri");

            return CreateClient(uri).CreateSession(uri.EndPoint);
        }
        #endregion
    }
}