【发布时间】:2019-03-20 22:03:39
【问题描述】:
在一个基于 Asp.Net Core MVC 的应用程序中,我们知道依赖注入 (DI) 是在 ConfigureServices 方法下的 Startup 类中定义的,如下所示:
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),其中包含与后端数据库通信所需的所有内容。
- 那么在我们的例子中,我们可以像这样在 BLL 中访问这个依赖注入吗?
public class MyClassLib
{
private readonly BloggingContext _context;
public MyClassLib(BloggingContext context)
{
_context = context;
}
}
- 我们还需要对现有数据库进行脚手架,因此 DbContext 类将在 DAL 项目中创建。 OnConfiguring 方法将在这个创建的 DbContext 类中定义。这里的连接字符串在类中是硬编码的。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Server=.;Database=TestDB;user id=sa;password=abcxyz");
}
}
但是我们可以在我们的 UI MVC 项目中的某个 json 文件中声明连接字符串,并在 DAL 中使用我们的 DbContext 类访问这个相同的连接字符串吗?
【问题讨论】:
-
1:是的,DI 在程序集边界上工作正常。一定要注册
MyClassLib -
2:在启动中进行正常配置,
if(!optionsBuilder.IsConfigured)不会触发。 -
@bommelding 正常配置是什么意思?
标签: c# database entity-framework-core connection-string asp.net-core-2.1