Как получить доступ к DbContext ядра EF из другого проекта при использовании в ядре ASP.NET? - PullRequest
0 голосов
/ 11 июня 2018

Я следовал шаблону, чтобы использовать EF Core с ядром ASP.NET, и все хорошо.Но недавно я создал проект «Расчет» и хочу сделать из него вызовы из базы данных.

Проблема в том, что я не знаю, как создать новый DbContextOptions.В моем коде это сделано с

   services.AddDbContext<RetContext>(options => options
            .UseLazyLoadingProxies()
            .UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Но в новом базовом классе .NET мне нужно предоставить его вручную.Как мне это сделать ?Мой код такой:

 public static class LoadData
{
    public static IConfiguration Configuration { get; }

    public static RefProgramProfileData Load_RefProgramProfileData(string code)
    {
        // var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
        // optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));

        //How do I make an optionsbuilder and get the configuration from the WEB project?
       UnitOfWork uow = new UnitOfWork(new RetContext(optionsBuilder));


        var loadedRefProgramProfileData  = uow.RefProgramProfileDataRepository
            .Find(x => x.ProgramCode == code).FirstOrDefault();

        return loadedRefProgramProfileData;
    }
}

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете создать свой экземпляр DbContext следующим образом:

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
var configuration = builder.Build();
var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
optionsBuilder.UseSqlServer(configuration.GetConnection("DefaultConnection"));
_context = new RetContext(optionsBuilder.Options); 

Однако идеальным вариантом является использование внедрения зависимостей.Допустим, у вас есть класс CalculationService в вашем другом проекте.Для этого вам нужно зарегистрировать этот класс как сервис, который может быть внедрен:

services.AddScoped<CalculationService>();

Тогда ваш класс может получать DbContext (или любые другие услуги) через DI:

public class CalculationService
{
    private RetContext _context;

    public CalculationService(RetContext context)
    {
        _context = context;
    }
}

Естественно, вы не сможете создать экземпляр своего класса вручную, например так:

var service = new CalculationService();

Вместо этого вам нужно будет создать любой класс, необходимый для использования вашего CalculationService, чтобы также получать его через DIи сделать этот класс также инъекционным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...