在C#控制台应用程序

时间:2018-04-23 02:24:55

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

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

我有一个带有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。我也试图注入

  

private ManagerService _managerService;

但得到同样的错误。

更新

如果我尝试

  

private static ApplicationDbContext _appDbContext = new   ApplicationDbContext();

如下所示,我得到了错误

  

没有任何论据符合所要求的形式   参数'选项'   'ApplicationDbContext.ApplicationDbContext(的 DbContextOptions )'

1 个答案:

答案 0 :(得分: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 将在整个控制台应用中提供。

希望有所帮助!