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 个参数:

  1. 连接工厂(IConnectionFactory)
  2. 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 中包含复杂的逻辑更具可读性。