/// <summary> /// 创建一个工厂实例 /// </summary> /// <param name="source">RabbitMq连接源</param> /// <param name="scope">对象生命周期管理器</param> /// <param name="logger">IDirectEventBus日志</param> /// <param name="logger2">ITopicEventBus日志</param> /// <param name="logger3">IFanoutEventBus日志</param> public EventBusFactory(DefaultMqConnectSource source, IServiceProvider scope, ILogger <IDirectEventBus> logger, ILogger <ITopicEventBus> logger2, ILogger <IFanoutEventBus> logger3) { DirectBusDic = new Dictionary <BusKey, IDirectEventBus>(BusKey.Compare); TopicBusDic = new Dictionary <BusKey, ITopicEventBus>(BusKey.Compare); FanoutBusDic = new Dictionary <BusKey, IFanoutEventBus>(BusKey.Compare); //var defaultDirect = scope.GetService<IDirectEventBus>(); //var defaultTopic = scope.GetService<ITopicEventBus>(); //if (defaultDirect != null) DirectBusDic.Add(new BusKey() { brokerName = defaultDirect.BROKER_NAME, connName = defaultDirect.ConnectionName }, defaultDirect); //if (defaultTopic != null) TopicBusDic.Add(new BusKey() { brokerName = defaultTopic.BROKER_NAME, connName = defaultTopic.ConnectionName }, defaultTopic); _sp = scope; _source = source; _logger = logger; _logger2 = logger2; _logger3 = logger3; }
/// <summary> /// 注册MQ连接字符串 /// <para>格式:server=ip:port;user=username;password=pwd;vhost=vhostname;name=zs</para> /// eventsmgr=inmemory /// </summary> /// <param name="builder"></param> /// <param name="action">创建MQ连接,可通过此方法创建多个连接;不同的连接通过name来区分</param> /// <param name="eventsManager">消息名称管理器</param> /// <param name="retryConnect">MQ断线重连尝试次数</param> /// <returns></returns> public static SoaServiceContainerBuilder UseRabbitMq(this SoaServiceContainerBuilder builder, Action <DefaultMqConnectSource> action, IAppEventsManager eventsManager = null, int retryConnect = 5) { lock (builder) { var obj = builder.GetTag(mqsettings); if (obj != null) { throw new ArgumentException("can not repeat register the rabbit-mq depend items"); } builder.SetTag(mqsettings, new object()); } var service = builder.Services; eventsManager ??= new DefaultEventsManager(); service.AddSingleton(eventsManager); builder.Services.AddSingleton(sp => { var subfact = sp.GetService <IEventBusSubManagerFactory>(); var connSource = new DefaultMqConnectSource(retryConnect, subfact); action.Invoke(connSource); return(connSource); }); builder.Services.AddSingleton <IEventBusSubManagerFactory, InMemorySubFactory>(sp => { var subfact = new InMemorySubFactory(eventsManager); return(subfact); }); builder.Services.AddSingleton(sp => { var source = sp.GetService <DefaultMqConnectSource>(); var l1 = sp.GetService <ILogger <IDirectEventBus> >(); var l2 = sp.GetService <ILogger <ITopicEventBus> >(); var l3 = sp.GetService <ILogger <IFanoutEventBus> >(); var busfact = new EventBusFactory(source, sp, l1, l2, l3); return(busfact); }); return(builder); }