我正在阅读this tutorial,并发现作者使用两种方法来获取MovieContext
。
在SeedData.Initialize
中,MovieContext
获得如下。
public static class SeedData
{
public static void Initialize(IServiceProvider isp)
{
DbContextOptions<MovieContext> options =
isp.GetRequiredService<DbContextOptions<MovieContext>>();
using (var context = new MovieContext(options))
{
// trimmed for simplicity
}
}
}
但在Program.Main
中,上下文的获取方式如下。
public class Program
{
public static void Main(string[] args)
{
IWebHost iwh = BuildWebHost(args);
using (IServiceScope iss = iwh.Services.CreateScope())
{
IServiceProvider isp = iss.ServiceProvider;
try
{
MovieContext context = isp.GetRequiredService<MovieContext>();
// trimmed for simplicity
}
}
}
}
之间有什么区别吗?
new MovieContext(isp.GetRequiredService<DbContextOptions<MovieContext>>());
和
isp.GetRequiredService<MovieContext>();
其中isp
的类型为IServiceProvider
?
答案 0 :(得分:2)
两种方法之间是否有任何区别。
在第一个示例中,您手动实例化上下文并使用容器注入其explicit dependency以解析和实例化选项(服务定位器)。
在第二个例子中,容器处理所有事情。它将解析该选项并在解析时将其注入上下文中。
我们什么时候需要做前者和后者的做法?
完全是偏好的问题。两者都可以完成,因为最终结果是相同的,具体取决于上下文在IoC容器中的注册方式。