.Net Core 3层体系结构将连接字符串从表示层传递到数据层问题

时间:2018-10-02 19:12:07

标签: c# .net-core asp.net-core-2.0 asp.net-core-webapi 3-tier

我有一个3层架构的Web API,如下所示:

PresentationLayer(在表示层中,我有appsetting.json,其中连接字符串在其中)

BusinessLayer(类库)

DataLayer(类库)

当我仍在使用.Net Framework时,我曾经在dataLayer中执行以下链接中所示的代码,以从表示层的web.config获取连接字符串:

enter image description here

现在,我正在尝试使用.Net Core 2.1,并且已经在数据层中构建了相同的类,但是它无法正常工作。如何最有效地将连接字符串从表示层传递到数据层。在使用.Net框架时,是否曾经有过类似的方式来传递连接字符串。

能帮我吗?

4 个答案:

答案 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);
    }
}