Привет в Autofac Я abble сделать это:StructureMap питания Строка параметров конструктору при запросе экземпляра
public class Service1_Client
{
private const string ServiceName = "Service1";
Func<string, RabitMqClient> _clientFunc;
public Service1_Client(Func<string, RabitMqClient> clientFunc)
{
_clientFunc = clientFunc;
}
public IList<object> GetData()
{
return _clientFunc(this.ServiceName).Get<IList<object>>();
}
}
public class Service2_Client
{
private const string ServiceName = "Service2";
Func<string, RabitMqClient> _clientFunc;
public Service2_Client(Func<string, RabitMqClient> clientFunc)
{
_clientFunc = clientFunc;
}
public IList<object> GetData()
{
return _clientFunc(this.ServiceName).Get<IList<object>>();
}
}
public class RabitMqClient
{
private IConnectionFactory _connectionFactory;
private string _baseServiceName;
public RabitMqClient(IConnectionFactory connectionFactory, string baseServiceName)
{
_connectionFactory = connectionFactory;
_baseServiceName = baseServiceName;
}
public TResult Get<TResult>()
{
string topicName = this.GetTopicName();
///Connect to the channel that uses the topic and ask for data...
}
private string GetTopicNAme()
{
/// this should be an algoritam for getting the topic from the speccified baseServiceName (I have omitted the details)
return this._baseServiceName;
}
}
Теперь объяснение: В принципе у меня есть класс (RabitMqClient), который зависит от 2-х параметров:
- ConnectionFactory (IConnectionFactory)
- baseServiceName (строка)
Эти параметры используются для подключения к серверу RabbitMq. Теперь я использую Темы в RabbitMq для диверсификации сервисов и для получения правильной темы используется строковый параметр baseServiceName. Ожидается, что вызывающий (Service1_Client, Service2_Client) будет предоставлять строковый параметр baseServiceName.
В Autofac я могу зарегистрировать этот класс, как это:
builder.Register((context, parameters) =>
{
var param = parameters.First() as Autofac.TypedParameter;
return new HcRabbitMqClient(
context.Resolve<IConnectionFactory>(),param.Value.ToString());
}).AsSelf().InstancePerDependency();
Это говорит Autofac, что при запросе этого класса, пусть Autofac разрешить первый параметр, но Caller поставит второй параметр (строка) в сайт вызова. Этот строковый параметр затем будет помещен в значение параметров. Использование этого можно увидеть в приведенном выше коде (Service1_Client, Service2_Client) GetData();
Как это сделать в StructureMap?
Можете ли вы дать немного больше информации о том, как это используется в вашем приложении с Autofac, пожалуйста? –