public IBusConfigurator Configure(string endpointName, IBusConfigurator cfg)
{
if (cfg == null)
{
throw new ArgumentNullException("cfg", "Файл конфигурации не может быть null");
}
EndpointElement endpointConfig = this.GetEndPointByName(endpointName);
cfg.SetEndpoint(endpointConfig.Name);
cfg.SetConnectionString(endpointConfig.ConnectionString);
if (!string.IsNullOrWhiteSpace(endpointConfig.LifecycleHandler))
{
cfg.HandleLifecycleWith(this.ResolveLifecycleHandler(endpointConfig.LifecycleHandler));
}
if (endpointConfig.Caching != null && endpointConfig.Caching.Enabled)
{
cfg.EnableCaching();
}
if (endpointConfig.ParallelismLevel.HasValue)
{
cfg.UseParallelismLevel(endpointConfig.ParallelismLevel.Value);
}
if (endpointConfig.FaultQueueTtl.HasValue)
{
cfg.UseFaultQueueTtl(endpointConfig.FaultQueueTtl.Value);
}
if (endpointConfig.FaultQueueLimit.HasValue)
{
cfg.UseFaultQueueLimit(endpointConfig.FaultQueueLimit.Value);
}
if (endpointConfig.Dynamic != null)
{
if (endpointConfig.Dynamic.Outgoing.HasValue)
{
if (endpointConfig.Dynamic.Outgoing.Value)
{
cfg.Route(MessageLabel.Any)
.ConfiguredWith(builder => new LambdaRouteResolver(
(endpoint, label) =>
{
builder.Topology.Declare(
Exchange.Named(label.Name)
.Durable.Fanout);
return new RabbitRoute(label.Name);
}));
}
}
}
if (endpointConfig.Qos != null)
{
if (endpointConfig.Qos.PrefetchCount.HasValue)
{
cfg.SetDefaultQoS(endpointConfig.Qos.PrefetchCount.Value);
}
}
foreach (ValidatorElement validator in endpointConfig.Validators)
{
if (validator.Group)
{
MessageValidatorGroup v = this.ResolveValidatorGroup(validator.Name);
cfg.RegisterValidators(v);
}
else
{
IMessageValidator v = this.ResolveValidator(validator.Name);
cfg.RegisterValidator(v);
}
}
foreach (OutgoingElement message in endpointConfig.Outgoing)
{
ISenderConfigurator senderCfg = cfg.Route(message.Label).
WithAlias(message.Key);
if (message.Confirm)
{
senderCfg.WithConfirmation();
}
if (message.Persist)
{
senderCfg.Persistently();
}
if (message.Ttl.HasValue)
{
senderCfg.WithTtl(message.Ttl.Value);
}
if (message.CallbackEndpoint.Default)
{
senderCfg.WithDefaultCallbackEndpoint();
}
if (message.Timeout.HasValue)
{
senderCfg.WithRequestTimeout(message.Timeout);
}
}
foreach (IncomingElement message in endpointConfig.Incoming)
{
IReceiverConfigurator receiver = cfg.On(message.Label).
WithAlias(message.Key);
if (message.RequiresAccept)
{
receiver.RequiresAccept();
}
Type messageType = typeof(ExpandoObject);
if (!string.IsNullOrWhiteSpace(message.Type))
{
messageType = ResolveType(message.Type);
}
var consumerFactory = this.BuildConsumerFactory(message.React, messageType);
object consumer = BuildConsumer(consumerFactory, messageType, message.Lifestyle);
RegisterConsumer(receiver, messageType, consumer);
if (!string.IsNullOrWhiteSpace(message.Validate))
{
IMessageValidator validator = this.ResolveValidator(message.Validate, messageType);
receiver.WhenVerifiedBy(validator);
}
}
return cfg;
}