在类库项目中具有DbContext依赖注入。可能吗?

时间:2018-10-16 11:21:23

标签: c# database entity-framework-core connection-string asp.net-core-2.1

在基于Asp.Net Core MVC的应用程序中,我们知道依赖注入(DI)是在 Startup 类中的 ConfigureServices 方法下定义的,如下所示:

var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection)); 

然后我们可以像这样通过构造函数在Controller中使用此DI:

public class BlogsController : Controller
{
    private readonly BloggingContext _context;

    public BlogsController(BloggingContext context)
    {
        _context = context;
    }

    // GET: Blogs
    public async Task<IActionResult> Index()
    {
        return View(await _context.Blog.ToListAsync());
    }
}

但是在一个真实的项目中,为了实现关注点的分离,我们利用业务逻辑层(BLL)并为此创建了一个单独的项目。同样,还有一个数据抽象层(DAL),其中包含与后端数据库进行通信所需的所有内容。

  1. 那么在我们这种情况下,我们可以像这样访问BLL中的依赖注入吗?

    public class MyClassLib
    {
        private readonly BloggingContext _context;

        public MyClassLib(BloggingContext context)
        {
            _context = context;
        }
    }
  1. 我们还需要对现有数据库进行脚手架,因此DbContext类将在DAL项目中创建。 OnConfiguring 方法将在此创建的DbContext类中定义。这里的连接字符串在类中是硬编码的。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
         if (!optionsBuilder.IsConfigured)
         {
             optionsBuilder.UseSqlServer("Server=.;Database=TestDB;user id=sa;password=abcxyz");
         }
    }

但是我们可以在一些json文件中的UI MVC项目中声明Connection字符串,并通过DbContext类在DAL中访问相同的连接字符串吗?

2 个答案:

答案 0 :(得分:0)

在Startup.cs类中,您可以找到带有IConfiguration参数的ctor。您可以读取json并使用Get <>方法转换为对象。您必须添加 Microsoft.Extensions.Configuration 程序包才能使用此扩展方法。

以最简单的方式,当您读取连接时,可以将其设置为静态类属性。因此,就像过去一样,我创建了 ConfigurationManager 类。

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        ConfigurationManager.ConnectionStrings = Configuration.GetSection("ConnectionStrings").Get<Dictionary<string, string>>();
    }

ConfigurationManager静态类:

public static class ConfigurationManager
{
    public static Dictionary<string, string> ConnectionStrings { get; set; }
}

现在,我们有了一个带有连接的ConfigurationManager对象,可以在任何需要的地方使用它。让我们在您的 OnConfiguring 方法中调用它:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
     if (!optionsBuilder.IsConfigured)
     {
         optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings ["connectionStringName"]);
     }
}

如果您想知道appSettings.json文件:

{
  "ConnectionStrings": {
    "yourConnectionName": "Data Source=ConnectionStrings goes here",
  }
}

答案 1 :(得分:0)

我猜想您可以在UI MVC项目json文件中声明连接字符串,并在构造函数中使用和注入IConfiguration(类似于this)在DAL中访问相同的连接字符串。

但是请注意,它可以not be done for CreateDbContext
如果要使用它向DAL中添加迁移,则必须以某种方式指出启动项目和迁移项目,如this answer所示。