Я работаю над Web API Core 2.2, и мне нужно разработать трехуровневую архитектуру. Как мне это сделать.
Моя структура проекта, как показано ниже
В проекте веб-API..
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<HrmsDbContext>(opt =>
opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
В проекте DAL (Library) я создал свой DBContext и предоставил строку подключения, как показано ниже.
Есть ли что-нибудь лучше, чтобы я не предоставлял строку подключения в двух местах? и написать трехуровневую архитектуру в хорошем смысле.
Любая помощь будет оценена.
Слой против уровня
Ваш вопрос касается слоев, а не уровней.
Уровни. Уровень — это просто физическое разделение компонентов вашего приложения.
Слои. Слои действуют как более логические разделители, которые существуют для разделения и организации вашего фактического кода. Вы часто будете слышать такие термины, как «уровень бизнес-логики», «уровень представления» и другие. Это просто способы организации всего кода в вашем приложении.
Если у вас есть веб-приложение, содержащее ваш доступ к данным и бизнес-логику, которое работает на том же компьютере/сервере, то у вас будет трехуровневое приложение на одном уровне.
Теперь, если ваш доступ к данным размещен на другом компьютере/сервере, и ваш бизнес также размещен на другом компьютере/сервере, то теперь у вас будет трехуровневое приложение на трех уровнях.
Установить строку подключения
Вы указали строку подключения при запуске и добавили ее в services. Вам не нужно снова определять строку подключения и использовать контекст БД с помощью встроенного внедрения зависимостей. Код может выглядеть так!
Стартовый класс
public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration)
{
// Add DbContext using SQL Server Provider
services.AddDbContext<PaymentDbContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("myconnectionstring"), x => x.MigrationsAssembly("Payment.Persistence")));
return services;
}
Класс контекста
public class PaymentDbContext : DbContext
{
public PaymentDbContext(DbContextOptions<PaymentDbContext> options)
: base(options)
{
}
public DbSet<Payments> Payments { get; set; }
}
Используйте DI для доступа к контексту
private readonly PaymentDbContext _context;
public PaymentsRepository(PaymentDbContext dbContext)
{
_context = dbContext;
}