使用Autofac将带参数的具体类型注册为null

时间:2012-11-06 18:30:42

标签: autofac

我有以下课程:

public class Errors
{ 
    private readonly string _connectionString;
    public Errors(string connectionString)
    {
         _connectionString = connectionString;
    }
}

我正在尝试使用Autofac进行注册:

builder.RegisterType<Errors>().WithParameter("connectionString", System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString);

此对象被注入另一个对象,但它始终为null。进一步查看异常,将显示以下错误消息:

Cannot choose between multiple constructors with equal length 1 on type   'System.String'.
Select the constructor explicitly, with the UsingConstructor() configuration method, when the component is registered.

我尝试使用UsingConstructor和WithParameter进行注册,但没有任何变化。

1 个答案:

答案 0 :(得分:4)

试试这个,有2种注册方式

第一次输入

builder.Register(c => new Errors(System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString)).InstancePerLifetimeScope();

第二种类型

public class Errors
{ 
    private string _connectionString{ get; set; }

    public Errors(string connectionString)
    {
        _connectionString = connectionString;
    }
}

如下所示注册

builder.RegisterType<Errors>().WithParameter("connectionString", System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString);

编辑:测试

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.Register(c => new Errors(ConfigurationManager.ConnectionStrings["myConn"].ConnectionString)).InstancePerLifetimeScope();      // Type 1
        // builder.RegisterType<Errors>().WithParameter("connectionString", ConfigurationManager.ConnectionStrings["myConn"].ConnectionString); // Type 2
        var container = builder.Build();

        var objErrors = container.Resolve<Errors>();
    }
}

配置文件看起来像

  <connectionStrings>
     <add name="myConn" connectionString="Some Connection String"/>
  </connectionStrings>

请阅读此Autofac Wiki

在Autofac版本中测试:2.6.1.841

<强>结果Result