我有一个3层架构的Web API,如下所示:
PresentationLayer(在表示层中,我有appsetting.json,其中连接字符串在其中)
BusinessLayer(类库)
DataLayer(类库)
当我仍在使用.Net Framework时,我曾经在dataLayer中执行以下链接中所示的代码,以从表示层的web.config获取连接字符串:
现在,我正在尝试使用.Net Core 2.1,并且已经在数据层中构建了相同的类,但是它无法正常工作。如何最有效地将连接字符串从表示层传递到数据层。在使用.Net框架时,是否曾经有过类似的方式来传递连接字符串。
能帮我吗?
答案 0 :(得分:0)
如何最有效地将连接字符串从表示层传递到数据层。在使用.Net框架时,是否曾经有过类似的方式来传递连接字符串。
在Asp.Net Core中,通过依赖注入将连接传递到DbConnection
更加容易。
更改DbConnection
以接受connection string
public class DbConnection
{
public DbConnection(string connectionString)
{
_sqlConnection = new SqlConnection(connectionString);
}
在DbConnection
中注册PresentationLayer
services.AddTransient<DbConnection>(serviceProvider => new DbConnection(Configuration.GetConnectionString("DefaultConnection")));
答案 1 :(得分:0)
创建AppSettings类
public static class AppSettings
{
public static string ConnectionString { get; set; }
}
在Startup.cs中
public Startup(IConfiguration configuration)
{
Configuration = configuration;
BuildAppSettingsProvider();
}
public IConfiguration Configuration { get; }
private void BuildAppSettingsProvider()
{
AppSettings.ConnectionString = Configuration["ConnectionString"];
}
现在您可以在表示层中访问AppSettings。
100%有效。
答案 2 :(得分:0)
当您有多个图层时,很可能正在使用IOC容器。在数据层中创建一个接口,并在视图层中执行该实现,然后在IOC容器中注册并获取它。如果您不能直接在SqlConnection中传递它,这是最干净的方法。
答案 3 :(得分:0)
有(最少)3个选项。我认为最好的方法是使用IoC容器。也许您更喜欢将appconfig文件添加到数据库层并访问它以进行层特定设置。或者,您可以使用默认注入机制将IConfiguration传递给业务层,然后通过ctor将其传递给DataLayer。
例如
/* ----- Startup.cs ----- */
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IxxxService, xxxBusinessService>();
}
/* ----- UI Layer ----- */
public xxxController(IxxxService xxxBusinessService)
{
this.xxxBusinessService = xxxBusinessService;
}
/* ----- BUSINESS LAYER ----- */
/*
UI/controller knows Business service and IConfiguration objects, and default
injector automatically creates/passes configuration object via ctor to Business layer.
*/
public xxxService(IConfiguration configuration)
{
this.xxxRepository = new xxxRepository(configuration);
}
/* ----- DATA LAYER ----- */
public class xxxRepository: BaseRepository, IxxxRepository
{
public xxxRepository(IConfiguration configuration)
: base(configuration)
{
}
}
public class BaseRepository{
protected xxxDbContext context;
public BaseRepository(IConfiguration configuration)
{
var optionsBuilder = new DbContextOptionsBuilder<xxxDbContext>();
optionsBuilder.UseSqlServer(configuration.GetSection("ConnectionString")["DefaultConnection"]);
this.context = new xxxDbContext(optionsBuilder.Options);
}
}