GetRequiredService <dbcontextoptions <moviecontext>&GT; V.S. GetRequiredService <moviecontext>

时间:2018-01-04 02:56:53

标签: c# entity-framework asp.net-core entity-framework-core

我正在阅读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

1 个答案:

答案 0 :(得分:2)

  

两种方法之间是否有任何区别。

在第一个示例中,您手动实例化上下文并使用容器注入其explicit dependency以解析和实例化选项(服务定位器)。

在第二个例子中,容器处理所有事情。它将解析该选项并在解析时将其注入上下文中。

  

我们什么时候需要做前者和后者的做法?

完全是偏好的问题。两者都可以完成,因为最终结果是相同的,具体取决于上下文在IoC容器中的注册方式。