Иметь инъекцию зависимостей DbContext в проекте библиотеки классов.Является ли это возможным? - PullRequest
0 голосов
/ 16 октября 2018

В приложении на основе Asp.Net Core MVC мы знаем, что Dependency Injection (DI) определен прямо в Startup классе в ConfigureServices метод следующим образом:

var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection)); 

И затем мы можем использовать этот DI в контроллере с помощью конструктора следующим образом:

public class BlogsController : Controller
{
    private readonly BloggingContext _context;

    public BlogsController(BloggingContext context)
    {
        _context = context;
    }

    // GET: Blogs
    public async Task<IActionResult> Index()
    {
        return View(await _context.Blog.ToListAsync());
    }
}

Но в реальном проекте для достижения разделения интересов мы используем уровень бизнес-логики (BLL) и создайте для него отдельный проект.Аналогичным образом, существует также уровень абстракции данных (DAL), который содержит все необходимое для взаимодействия с базой данных бэкэнда.

  1. Таким образом, в нашем случае мы можем получить доступ к этой инъекции зависимостей в BLL следующим образом?

    public class MyClassLib
    {
        private readonly BloggingContext _context;

        public MyClassLib(BloggingContext context)
        {
            _context = context;
        }
    }
Кроме того, нам необходимо создать леса для существующей базы данных, и, как таковой, класс DbContext будет создан в проекте DAL. OnConfiguring метод будет определен в этом созданном классе DbContext.Здесь строка подключения жестко запрограммирована в классе.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
         if (!optionsBuilder.IsConfigured)
         {
             optionsBuilder.UseSqlServer("Server=.;Database=TestDB;user id=sa;password=abcxyz");
         }
    }

Но можем ли мы объявить строку подключения в нашем UI MVC-проекте в каком-то файле json и получить доступ к этой же строке подключения в DAL с помощью нашего класса DbContext?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Полагаю, вы можете объявить строки подключения в вашем json-файле проекта MVC UI и получить доступ к этой же строке подключения в DAL, используя и вставив IConfiguration в конструктор (аналогично this ).

Но обратите внимание, что не может быть сделано для CreateDbContext.
Если вы хотите использовать его для добавления миграций к вашему DAL, вы должны каким-то образомукажите на проект запуска и проект миграции, как показано в этот ответ .

0 голосов
/ 16 октября 2018

В классе Startup.cs вы найдете ctor с параметром IConfiguration.Вы можете прочитать json и преобразовать в объект с помощью метода Get <>.Вы должны добавить Microsoft.Extensions.Configuration пакет, чтобы использовать этот метод расширения.

Проще всего, когда вы читаете соединения, вы можете установить для него статическое свойство класса.Поэтому я создал ConfigurationManager класс, как в старые добрые времена.

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        ConfigurationManager.ConnectionStrings = Configuration.GetSection("ConnectionStrings").Get<Dictionary<string, string>>();
    }

Статический класс ConfigurationManager:

public static class ConfigurationManager
{
    public static Dictionary<string, string> ConnectionStrings { get; set; }
}

Теперь у нас есть объект ConfigurationManager с подключениями и мы можемиспользуйте это где угодноДавайте назовем его в вашем OnConfiguring методе:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
     if (!optionsBuilder.IsConfigured)
     {
         optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings ["connectionStringName"]);
     }
}

Если вам интересно файл appSettings.json:

{
  "ConnectionStrings": {
    "yourConnectionName": "Data Source=ConnectionStrings goes here",
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...