我试图解决这个问题,但我被困住了。
我有一个带有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 )'
答案 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 将在整个控制台应用中提供。
希望有所帮助!