StructureMap 在请求实例时向构造函数提供字符串参数
StructureMap Supply string Parameter to Constructor when Requesting an Instance
嗨,Autofac 我可以做到这一点:
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;
}
}
现在解释:
基本上我有一个 class (RabitMqClient) 取决于 2 个参数:
- 连接工厂(IConnectionFactory)
- baseServiceName(字符串)
这些参数用于连接到 RabbitMq 服务器。
现在我在RabbitMq中使用Topics来实现服务的多样化,为了得到正确的Topic,使用了字符串参数baseServiceName。
预计调用者 (Service1_Client, Service2_Client) 提供字符串参数 baseServiceName.
在 Autofac 中,我可以这样注册 class:
builder.Register((context, parameters) =>
{
var param = parameters.First() as Autofac.TypedParameter;
return new HcRabbitMqClient(
context.Resolve<IConnectionFactory>(),param.Value.ToString());
}).AsSelf().InstancePerDependency();
这告诉 Autofac,当请求此 class 时,让 Autofac 解析第一个参数,但调用者将在调用站点提供第二个(字符串)参数。然后,此字符串参数将放入参数值中。
this的用法见上面代码(Service1_Client,Service2_Client)GetData()方法;
如何在 StructureMap 中执行此操作?
试试这个
For<Func<string, RabitMqClient>>().Use(cstr => new RabitMqClient(cstr));
如何扩展工厂模式?
public interface IRabitMqClientFactory
{
IRabitMqClientFactory Create(string baseServiceName);
}
public class RabitMqClientFactory : IRabitMqClientFactory
{
public RabitMqClientFactory(IConnectionFactory connectionFactory){
_connectionFactory = connectionFactory;
}
public IRabitMqClientFactory Create(string baseServiceName)
{
_baseServiceName = baseServiceName;
}
}
然后简单
public class Service1_Client
{
private const string ServiceName = "Service1";
private RabbitMqClient _rabbitMqClient;
public Service1_Client(IRabitMqClientFactory rabitMqClientFactory)
{
_rabbitMqClient = rabitMqClientFactory.Create(ServiceName);
}
public IList<object> GetData()
{
return _rabbitMqClient.Get<IList<object>>();
}
}
它也比在 IoC 中包含复杂的逻辑更具可读性。
嗨,Autofac 我可以做到这一点:
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;
}
}
现在解释: 基本上我有一个 class (RabitMqClient) 取决于 2 个参数:
- 连接工厂(IConnectionFactory)
- baseServiceName(字符串)
这些参数用于连接到 RabbitMq 服务器。 现在我在RabbitMq中使用Topics来实现服务的多样化,为了得到正确的Topic,使用了字符串参数baseServiceName。 预计调用者 (Service1_Client, Service2_Client) 提供字符串参数 baseServiceName.
在 Autofac 中,我可以这样注册 class:
builder.Register((context, parameters) =>
{
var param = parameters.First() as Autofac.TypedParameter;
return new HcRabbitMqClient(
context.Resolve<IConnectionFactory>(),param.Value.ToString());
}).AsSelf().InstancePerDependency();
这告诉 Autofac,当请求此 class 时,让 Autofac 解析第一个参数,但调用者将在调用站点提供第二个(字符串)参数。然后,此字符串参数将放入参数值中。 this的用法见上面代码(Service1_Client,Service2_Client)GetData()方法;
如何在 StructureMap 中执行此操作?
试试这个
For<Func<string, RabitMqClient>>().Use(cstr => new RabitMqClient(cstr));
如何扩展工厂模式?
public interface IRabitMqClientFactory
{
IRabitMqClientFactory Create(string baseServiceName);
}
public class RabitMqClientFactory : IRabitMqClientFactory
{
public RabitMqClientFactory(IConnectionFactory connectionFactory){
_connectionFactory = connectionFactory;
}
public IRabitMqClientFactory Create(string baseServiceName)
{
_baseServiceName = baseServiceName;
}
}
然后简单
public class Service1_Client
{
private const string ServiceName = "Service1";
private RabbitMqClient _rabbitMqClient;
public Service1_Client(IRabitMqClientFactory rabitMqClientFactory)
{
_rabbitMqClient = rabitMqClientFactory.Create(ServiceName);
}
public IList<object> GetData()
{
return _rabbitMqClient.Get<IList<object>>();
}
}
它也比在 IoC 中包含复杂的逻辑更具可读性。