0

.net 核心 webapi 应用程序与 entityframeworkcore。试图弄清楚除了 dbcontext 之外,如何将额外的连接字符串传递给数据访问库类。请参阅下面的** dbcontext ** 是我想要做的。

启动.cs

       var SqlConnection = Configuration.GetConnectionString("SQLConnection");  
       var BlobConnection = Configuration.GetConnectionString("BlobConnection");

        services.AddEntityFramework()
                .AddEntityFrameworkSqlServer()
                .AddDbContext<VISTrackingContext>(options => options.UseSqlServer(SqlConnection, 
                sqlServerOptionsAction: sqlOptions =>
                {
                    sqlOptions.EnableRetryOnFailure(maxRetryCount: 5,
                    maxRetryDelay: TimeSpan.FromSeconds(5),
                    errorNumbersToAdd: null);
                }));

        services.AddScoped<IDataManager>(c => new DataManager(**_dbcontext**, BlobConnection));

        public FileController(IDataManager manager)
        {
            _datamanager = manager;
        }

        public DataManager(VISTrackingContext dbcontext, string blobconnection)
        {
            _dbcontext = dbcontext;
            _blobconnection = blobconnectionstring;
        }

这可以做到吗?还是有另一种方法通过上下文对象本身注入额外的连接字符串?我看到很多关于这样做的评论和选项,但没有一种方法同时处理上下文和传递给存储库对象的连接字符串。

4

2 回答 2

1

您可以将这些连接字符串存储在一个对象中,并将其注入 DataManager。

例如,

public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
      ...
      services.AddSingleton(provider => new DataSettings(
         Configuration.GetConnectionString("SQLConnection"), 
         Configuration.GetConnectionString("BlobConnection")));

      services.AddScoped<IDataManager, DataManager>();
      ...
   }
}

public class DataSettings
{
    public DataSettings(string sqlConnection, string blobConnection)
    {
        SQLConnection = sqlConnection;
        BlobConnection = blobConnection;
    }

    public string SQLConnection { get; }

    public string BlobConnection { get; }
}

public DataManager(VISTrackingContext dbcontext, DataSettings dataSettings)
{
   _dbcontext = dbcontext;
   _blobconnection = dataSettings.BlobConnection;
}
于 2017-06-27T23:55:41.653 回答
0

除了@Win's answer之外,还有一种更通用的方法:

public class ConnectionStrings : Dictionary<string,string> { }

启动.cs

services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
service.AddScoped<IDataManager,DataManager>();

// or
services.AddScoped<IDataManager>(c => new DataManager(
    c.GetRequiredService<YourDbContext>(),
    c.GetRequiredService<ConnectionStrings>()["BlobConnection"])
);

服务

public DataManager(VISTrackingContext dbcontext, ConnectionStrings connectionStrings)
于 2017-06-28T06:09:44.020 回答