Autofac在运行时解析参数

Man*_*kis 2 connection-string autofac c#-4.0

让我们直截了当.我有这样的接口和类:

public interface IDataBase
{
    DataTable GetSomeTableData();
}
Run Code Online (Sandbox Code Playgroud)

我的课:

public class DataBase : IDataBase    
{
    private readonly string _connectionString;

    public DataBase(string connectionString)
    {
        this._connectionString = connectionString;
    }

    public DataTable GetSomeTableData()
    {
        using (SqlConnection cn = new SqlConnection(_connectionString))
        {
             cn.Open();
             // some select
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Autofac注入该类:

var builder = new ContainerBuilder();
builder.RegisterType<DataBase>().As<IDataBase>).WithParameter("connectionString", "my connection string");
var container = builder.Build();
var database = container.Resolve<IDataBase>();
var tableData1 = database.GetSomeTableData();
// change connection string ?????????????????
var tableData2 = database.GetSomeTableData();
Run Code Online (Sandbox Code Playgroud)

我需要从一个DB和另一个DB获取表数据.如何在注册课程后更改连接字符串?你可以给另一个exapmle ..

Jac*_*goń 9

有很多方法可以做到这一点.一种是创建和注入服务而不仅仅是普通的连接字符串.

public interface IConnectionStringProvider
{
    public string ConnectionString { get; set }
}

public class ConnectionStringProvider
{
    public string ConnectionString { get; set }
}


var builder = new ContainerBuilder();
builder.RegisterType<DataBase>()
    .As<IDataBase>);
builder.RegisterType<ConnectionStringProvider>)
    .As<IConnectionStringProvider>
    .SingleInstance();

var container = builder.Build();
var database = container.Resolve<IDataBase>();
var connStringProvider = container.Resolve<IConnectionStringProvider>();
var tableData1 = database.GetSomeTableData();
connStringProvider.ConnectionString = "...";
var tableData2 = database.GetSomeTableData();
Run Code Online (Sandbox Code Playgroud)

然后,DataBase将使用该服务:

public class DataBase : IDataBase    
{
    private readonly IConnectionStringProvider _connectionStringProvider;

    public DataBase(IConnectionStringProvider connectionStringProvider)
    {
        this._connectionStringProvider = connectionStringProvider;
    }

    public DataTable GetSomeTableData()
    {
        using (SqlConnection cn = new SqlConnection(_connectionStringProvider.ConnectionString))
        {
             cn.Open();
             // some select
        }
    }
}
Run Code Online (Sandbox Code Playgroud)