4

私は次のクラスを持っています:

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 を使用して登録しようとしましたが、変更はありません。

4

1 に答える 1

4

これを試してみてください。登録には2つの方法があります

最初のタイプ:

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

2 番目のタイプ:

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

結果: 結果

于 2012-11-06T18:40:33.677 に答える