Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active September 1, 2026 14:25
Show Gist options
  • Select an option

  • Save sunmeat/14b135619823943996aaa1e25bfb3f17 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/14b135619823943996aaa1e25bfb3f17 to your computer and use it in GitHub Desktop.
додавання реалізації репозиторію для роботи з Firebase

Інструкція: Додавання Firebase Realtime Database репозиторію до ASP.NET Core MVC проєкту

Цей посібник описує покроковий процес створення та підключення нового репозиторію FirebaseStudentRepository поруч із існуючим StudentRepository (EF Core) із використанням паттерну Repository та Dependency Injection.


📦 Крок 1. Встановлення необхідного NuGet-пакета

Для роботи з Firebase Realtime Database через Web API встановіть пакет FirebaseDatabase.net.

Відкрийте Terminal у Visual Studio / JetBrains Rider або командну стрічку в папці проєкту та виконайте:

dotnet add package FirebaseDatabase.net

⚙️ Крок 2. Конфігурація appsettings.json

Додайте секцію "Firebase" у файл appsettings.json. Рядок підключення SQL Server залишається без змін.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=Students;Integrated Security=SSPI;TrustServerCertificate=true"
  },
  "Firebase": {
    "ApiKey": "",
    "AuthDomain": "",
    "DatabaseUrl": "",
    "ProjectId": "",
    "StorageBucket": "",
    "MessagingSenderId": "",
    "AppId": ""
  }
}

⚠️ Порада щодо безпеки: не публікуйте реальні ключі Firebase у відкритих репозиторіях (наприклад, GitHub). Для продакшн-середовища використовуйте User Secrets або змінні середовища.


🧹 Крок 3. Очищення моделі Student.cs

Переконайтеся, що модель не містить специфічних анотацій для Cloud Firestore. Залишаємо лише анотації [Display] для представлень MVC.

Файл: Models/Student.cs (або Student.cs у корені)

using System.ComponentModel.DataAnnotations;

namespace mvc
{
    public class Student
    {
        public int Id { get; set; }

        [Display(Name = "Ім'я")]
        public string? Name { get; set; }

        [Display(Name = "Прізвище")]
        public string? Surname { get; set; }

        [Display(Name = "Вік")]
        public int Age { get; set; }

        [Display(Name = "Середній бал")]
        public double GPA { get; set; }
    }
}

🗂️ Крок 4. Створення нового файлу репозиторію

Створіть новий файл Repository/FirebaseStudentRepository.cs поруч із StudentRepository.cs.

Важливо: Не переписуйте та не видаляйте файл StudentRepository.cs — обидва класи мають існувати паралельно.

Файл: Repository/FirebaseStudentRepository.cs

using Firebase.Database;
using Firebase.Database.Query;
using mvc;

namespace mvc.Repository
{
    public class FirebaseStudentRepository : IRepository
    {
        private readonly FirebaseClient _firebaseClient;
        private const string CollectionName = "students";

        public FirebaseStudentRepository(IConfiguration config)
        {
            string databaseUrl = config["Firebase:DatabaseUrl"]
                ?? throw new InvalidOperationException("Firebase:DatabaseUrl не налаштовано в appsettings.json.");

            _firebaseClient = new FirebaseClient(databaseUrl);
        }

        public async Task<List<Student>> GetStudentList()
        {
            try
            {
                // спроба зчитати дані як JSON-об'єкт/словник
                var studentsDict = await _firebaseClient
                    .Child(CollectionName)
                    .OnceSingleAsync<Dictionary<string, Student>>();

                if (studentsDict == null) return new List<Student>();

                return studentsDict
                    .Where(pair => pair.Value != null)
                    .Select(pair =>
                    {
                        var student = pair.Value;
                        if (student.Id == 0 && int.TryParse(pair.Key, out int id))
                        {
                            student.Id = id;
                        }
                        return student;
                    }).ToList();
            }
            catch
            {
                // захист: якщо Firebase повернув JSON-масив виду [null, {...}]
                var studentsList = await _firebaseClient
                    .Child(CollectionName)
                    .OnceSingleAsync<List<Student>>();

                if (studentsList == null) return new List<Student>();

                return studentsList
                    .Where(s => s != null)
                    .ToList();
            }
        }

        public async Task<Student> GetStudent(int id)
        {
            var student = await _firebaseClient
                .Child(CollectionName)
                .Child(id.ToString())
                .OnceSingleAsync<Student>();

            if (student == null)
                throw new InvalidOperationException($"Студента з айді {id} не знайдено.");

            student.Id = id;
            return student;
        }

        public async Task Create(Student item)
        {
            if (item.Id == 0)
            {
                var list = await GetStudentList();
                item.Id = list.Any() ? list.Max(s => s.Id) + 1 : 1;
            }

            await _firebaseClient
                .Child(CollectionName)
                .Child(item.Id.ToString())
                .PutAsync(item);
        }

        public void Update(Student item)
        {
            _firebaseClient
                .Child(CollectionName)
                .Child(item.Id.ToString())
                .PutAsync(item)
                .GetAwaiter()
                .GetResult();
        }

        public async Task Delete(int id)
        {
            await _firebaseClient
                .Child(CollectionName)
                .Child(id.ToString())
                .DeleteAsync();
        }

        public Task Save()
        {
            // зміни в Realtime Database зберігаються миттєво під час виклику PutAsync/DeleteAsync
            return Task.CompletedTask;
        }
    }
}

для генерик-версії інтерфейсу репозиторію реалізація може бути такою: https://claude.ai/share/71323584-1db5-4f22-a27f-066c5196baab

🔀 Крок 5. Перемикання репозиторію в Program.cs

У файлі Program.cs зареєструйте новий репозиторій у контейнері Dependency Injection (builder.Services).

Щоб повернутися до SQL Server (EF Core), достатньо буде закоментувати рядок Firebase та розкоментувати рядок StudentRepository.

using Microsoft.EntityFrameworkCore;
using mvc.Repository;

namespace mvc
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // 1. Контекст EF Core (можна закоментувати, якщо SQL Server тимчасово не потрібен)
            // string? connection = builder.Configuration.GetConnectionString("DefaultConnection");
            // builder.Services.AddDbContext<StudentContext>(options => options.UseSqlServer(connection));

            builder.Services.AddControllersWithViews();

            // 2. Вибір джерела даних (DI):

            // Варіант А: Робота через EF Core / SQL Server
            // builder.Services.AddScoped<IRepository, StudentRepository>();

            // Варіант Б: Робота через Firebase Realtime Database
            builder.Services.AddScoped<IRepository, FirebaseStudentRepository>();

            var app = builder.Build();

            app.UseStaticFiles();

            app.MapControllerRoute(
                name: "default",
                pattern: "{controller=Student}/{action=Index}/{id?}");

            app.Run();
        }
    }
}

🔐 Крок 6. Налаштування правил доступу у Firebase Console

Для коректної роботи запитів без передачі приватного сервісного ключа перевірте правила доступу в базі даних:

  1. Перейдіть до Firebase Console.
  2. Відкрийте ваш проєкт → BuildRealtime Database.
  3. Перейдіть у вкладку Rules.
  4. Встановіть правила для тестування та натисніть Publish:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

⚠️ Увага: ці правила відкривають повний доступ на читання/запис для всіх — використовуйте їх лише для тестування, а перед продакшн-релізом налаштуйте автентифікацію та обмежені правила доступу.


✅ Підсумок

Крок Дія
1 Встановлено пакет FirebaseDatabase.net
2 Додано конфігурацію Firebase в appsettings.json
3 Модель Student.cs без змін
4 Створено FirebaseStudentRepository.cs
5 Налаштовано перемикання репозиторіїв через DI у Program.cs
6 Налаштовано правила доступу в Firebase Console
@sunmeat

sunmeat commented Aug 31, 2026

Copy link
Copy Markdown
Author

початкова версія проєкту: https://github.com/sunmeat/aspnetcore_repository

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment