【问题标题】:Accessing dbContext in a C# console application在 C# 控制台应用程序中访问 dbContext
【发布时间】:2018-10-02 23:57:02
【问题描述】:

我试图解决这个问题,但我被卡住了。

我有一个带有 Service/Repo/Api/Angular 层的 Net Core 2 应用程序 - 但现在我想“连接”一个控制台应用程序并访问我已经构建的所有好东西。我似乎陷入了一堆静态对象以及 DI 和 null 参数中。无论如何,这是我的代码的简化版本。

namespace SimpleExample
{

    class Program
    {

        private static ApplicationDbContext _appDbContext;

        public Program(ApplicationDbContext appDbContext)
        {
            _appDbContext = appDbContext;
        }

        static void Main(string[] args)
        {
            var instance = new Program();  // this doesn't work!
            var instance = new Program(_appDbContext);  // neither does this!
            instance.GetData();
        }


        private void GetData()
        {
            Console.WriteLine("Let's read some data! Press a key to continue.");
            Console.ReadLine();

            var data = "my data";
            var result = GetId(data);
        }


        private string GetId(string original)
        {
            var data = _appDbContext.Data
                .Where(x => x.Name == original.Trim)
                .FirstOrDefault();

            return data;

        }
    }

}

我得到了经典

'非静态字段需要对象引用'

错误。然后从这里的调查开始,我将事物更改为静态,然后一切都变为空。

这不仅仅是我试图注入的 DbContext。我也在尝试注入

私有ManagerService_managerService;

但遇到同样的错误。

更新

如果我尝试

私有静态 ApplicationDbContext _appDbContext = new ApplicationDbContext();

按照下面几次的建议,然后我得到了错误

没有给出与所需形式相对应的参数 参数“选项”的 'ApplicationDbContext.ApplicationDbContext(DbContextOptions)'

【问题讨论】:

  • 你在哪里实例化_appDbContext
  • 试试private static ApplicationDbContext _appDbContext = new ApplicationDbContext();

标签: c# dependency-injection .net-core console-application


【解决方案1】:

好的,我已经想通了,我会为在这种情况下苦苦挣扎的其他人发布我的答案。

当您启动控制台应用程序时,您的正常 startup.cs 不会执行,因此您必须在控制台应用程序中放入大量代码。

    private static SiteService _siteService;
    private static ApplicationDbContext _appDbContext;

    public static void Main()
    {
        var services = new ServiceCollection();                      

        services.AddTransient<ISiteInterface, SiteRepo>();
        services.AddTransient<SiteService>();
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer("blah-blah"));            

        var serviceProvider = services.BuildServiceProvider();                                             
        _siteService = serviceProvider.GetService<SiteService>();
        _appDbContext = serviceProvider.GetService<ApplicationDbContext>();    
        GetData();
    }

现在您的 _appDbContext 将在您的控制台应用程序的其余部分中可用。

希望有帮助!

【讨论】:

  • ServiceCollection 是在哪里定义的?
  • 它来自 * using Microsoft.Extensions.DependencyInjection; * 将其添加到顶部。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多