ISBuilder 8.7.2

dotnet add package ISBuilder --version 8.7.2
                    
NuGet\Install-Package ISBuilder -Version 8.7.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ISBuilder" Version="8.7.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ISBuilder" Version="8.7.2" />
                    
Directory.Packages.props
<PackageReference Include="ISBuilder" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ISBuilder --version 8.7.2
                    
#r "nuget: ISBuilder, 8.7.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ISBuilder@8.7.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ISBuilder&version=8.7.2
                    
Install as a Cake Addin
#tool nuget:?package=ISBuilder&version=8.7.2
                    
Install as a Cake Tool

ISBuilder

Information System Builder — конструктор информационных систем на .NET 8.
Один пакет — все инструменты для разработки WinForms + EF Core + SQL Server приложений.

Установка

dotnet add package ISBuilder

Подтягивает все 27 пакетов автоматически. Ничего дополнительно устанавливать не нужно.


Состав пакетов

Пакет Пространство имен Описание
AppBuilder AppBuilder Конструктор CRUD-приложений за 15 строк
ExportKit UniversalExport Экспорт/импорт в 11 форматов (JSON, XML, CSV, TXT, Excel, PDF, HTML, YAML, Markdown, Word, SQL)
EFQueryKit EFQueryKit Запросы EF без лямбд, CRUD, агрегации
AutoFormsKit AutoForms Автогенерация диалогов с валидацией [Required], [StringLength], [DataType]
SeedKit SeedKit Генератор тестовых данных (русские ФИО, адреса, телефоны)
TestCaseKit TestCaseKit Генератор тест-кейсов для тестирования ИС
ISBuilder Мета-пакет, подтягивает все 27 пакетов
ConnectKit ConnectKit Визуальный диалог подключения к SQL Server
NotifyKit NotifyKit Всплывающие уведомления (тосты)
AppSettingsKit SettingsKit Хранение настроек приложения в JSON с секциями
ValidationKit ValidationKit Валидация данных без лямбд
MenuKit MenuKit Генератор меню WinForms
DashboardKit DashboardKit Панель статистики с цветными карточками
MigrationKit MigrationKit Управление БД (создание, бэкап, восстановление, сид)
HelpKit HelpKit Автоматическая справка по модели данных
DataDictKit DataDictKit Словарь данных в Word
SearchKit SearchKit Панель поиска для DataGridView
StatusBarKit StatusBarKit Статусная строка с часами и счетчиком записей
AuthKit AuthKit Авторизация (логин, роли, хеширование паролей)
UmlKit UmlKit UML/ER-диаграммы (PlantUML, Mermaid, Draw.io)
PrintKit PrintKit Печать таблиц с предпросмотром
ThemeKit ThemeKit 6 тем оформления (Dark, Light, Blue, Green, Purple, Orange) + сохранение выбора
ChartKit ChartKit Диаграммы (столбчатая, круговая, линейная)
AuditKit AuditKit Журнал действий пользователей
SchedulerKit SchedulerKit Планировщик фоновых задач
ReportKit ReportKit Генерация PDF-отчетов с таблицами и сводкой
CalcKit CalcKit Бизнес-калькуляторы (кредит, депозит, пособие, доставка и др.)
MatchKit MatchKit Движок подбора записей по критериям с оценкой совпадения

Полный рабочий пример: ИС "Служба занятости"

Один файл Program.cs -- полноценная информационная система с дашбордом, CRUD, поиском, экспортом в 9 форматов, словарём данных и тест-кейсами. Установка: dotnet add package ISBuilder + dotnet add package Microsoft.EntityFrameworkCore.SqlServer.

// Полный рабочий пример — один файл Program.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using AppBuilder;
using SeedKit;
using AuditKit;
using DataDictKit;
using TestCaseKit;

var db = new EmploymentDb();
db.Database.EnsureCreated();

if (!db.Enterprises.Any())
{
    var enterprises = Seeder.Generate<Enterprise>(10);
    foreach (var e in enterprises) e.Id = 0;
    db.Enterprises.AddRange(enterprises);
    db.SaveChanges();

    var vacancies = Seeder.GenerateLinked<Vacancy, Enterprise>(50, enterprises.ToList(), "EnterpriseId");
    foreach (var v in vacancies) v.Id = 0;
    db.Vacancies.AddRange(vacancies);
    db.SaveChanges();

    var applicants = Seeder.Generate<Applicant>(30);
    foreach (var a in applicants) a.Id = 0;
    db.Applicants.AddRange(applicants);
    db.SaveChanges();

    // Отклики
    var rnd = new Random();
    var vacList = db.Vacancies.ToList();
    var appList = db.Applicants.ToList();
    for (int i = 0; i < 20; i++)
    {
        db.Applications.Add(new VacancyApplication
        {
            ApplicantId = appList[rnd.Next(appList.Count)].Id,
            VacancyId = vacList[rnd.Next(vacList.Count)].Id
        });
    }
    db.SaveChanges();

    // Словарь данных
    DataDictionary.GenerateDocx(db, "Словарь_данных.docx");
    DataDictionary.GenerateJson(db, "Словарь_данных.json");

    // Тест-кейсы
    var cases = new List<TestCase>();
    cases.AddRange(TestCaseGenerator.GenerateCrud<Vacancy>("Вакансии"));
    cases.AddRange(TestCaseGenerator.GenerateCrud<Applicant>("Соискатели"));
    cases.AddRange(TestCaseGenerator.GenerateCrud<Enterprise>("Предприятия"));
    UniversalExport.ExportManager.Export(
        TestCaseGenerator.ToDataTable(cases, "Тест-кейсы"), "Тест_кейсы.xlsx");

    Audit.Log(db, "БД создана, словарь и тест-кейсы сгенерированы", "system");
}

App.Create<EmploymentDb>("ИС «Городская служба занятости»")
   .WithMenu()
   .WithDashboard(d => new[]
   {
       ("Предприятий", (object)d.Enterprises.Count(), Color.FromArgb(52, 152, 219)),
       ("Вакансий",    (object)d.Vacancies.Count(),   Color.FromArgb(46, 204, 113)),
       ("Соискателей", (object)d.Applicants.Count(),  Color.FromArgb(155, 89, 182)),
       ("Откликов",    (object)d.Applications.Count(), Color.FromArgb(230, 126, 34))
   })
   .AddTab<Enterprise>("Предприятия")
   .AddTab<Vacancy>("Вакансии")
   .AddTab<Applicant>("Соискатели")
   .AddTab<VacancyApplication>("Отклики")
   .WithExport()
   .WithSearch()
   .WithStatusBar()
   .Size(1280, 800)
   .Run();

// --- Перечисления ---

public enum EmploymentType
{
    [Display(Name = "Полная")] Полная,
    [Display(Name = "Частичная")] Частичная,
    [Display(Name = "Удалённая")] Удалённая,
    [Display(Name = "Стажировка")] Стажировка
}

public enum EducationLevel
{
    [Display(Name = "Среднее")] Среднее,
    [Display(Name = "Среднее специальное")] СреднееСпециальное,
    [Display(Name = "Незаконченное высшее")] НезаконченноеВысшее,
    [Display(Name = "Высшее")] Высшее,
    [Display(Name = "Магистратура")] Магистратура,
    [Display(Name = "Аспирантура")] Аспирантура
}

public enum ApplicationStatus
{
    [Display(Name = "На рассмотрении")] НаРассмотрении,
    [Display(Name = "Приглашён на собеседование")] Собеседование,
    [Display(Name = "Принят")] Принят,
    [Display(Name = "Отклонён")] Отклонён
}

// --- Модели ---

public class Enterprise
{
    public int Id { get; set; }
    [Display(Name = "Название"), Required, StringLength(100)]
    public string Name { get; set; } = "";
    [Display(Name = "Юридический адрес")] public string LegalAddress { get; set; } = "";
    [Display(Name = "Фактический адрес")] public string ActualAddress { get; set; } = "";
    [Display(Name = "Телефон")] public string Phone { get; set; } = "";
    [Display(Name = "Контактное лицо")] public string ContactPerson { get; set; } = "";
    public List<Vacancy> Vacancies { get; set; } = new();
    public override string ToString() => Name;
}

public class Vacancy
{
    public int Id { get; set; }
    [Display(Name = "Должность"), Required] public string Position { get; set; } = "";
    [Display(Name = "Оклад")] public decimal Salary { get; set; }
    [Display(Name = "Занятость")] public EmploymentType EmploymentType { get; set; } = EmploymentType.Полная;
    [Display(Name = "Требуемое образование")] public EducationLevel RequiredEducation { get; set; } = EducationLevel.Среднее;
    [Display(Name = "Мин. возраст")] public int MinAge { get; set; }
    [Display(Name = "Макс. возраст")] public int MaxAge { get; set; }
    [Display(Name = "Требуемый стаж (лет)")] public int RequiredExperience { get; set; }
    [Display(Name = "Дата публикации")] public DateTime PublishedDate { get; set; } = DateTime.Now;
    [Display(Name = "Активна")] public bool IsActive { get; set; } = true;
    [Display(Name = "Предприятие")] public int EnterpriseId { get; set; }
    [ForeignKey("EnterpriseId")] public Enterprise? Enterprise { get; set; }
    public override string ToString() => $"{Position} ({Salary:N0} руб.)";
}

public class Applicant
{
    public int Id { get; set; }
    [Display(Name = "ФИО"), Required] public string FullName { get; set; } = "";
    [Display(Name = "Адрес регистрации")] public string RegistrationAddress { get; set; } = "";
    [Display(Name = "Адрес проживания")] public string ActualAddress { get; set; } = "";
    [Display(Name = "Телефон")] public string Phone { get; set; } = "";
    [Display(Name = "Образование")] public EducationLevel Education { get; set; } = EducationLevel.Среднее;
    [Display(Name = "Стаж (лет)")] public int Experience { get; set; }
    [Display(Name = "Прежняя зарплата")] public decimal PreviousSalary { get; set; }
    [Display(Name = "Прежняя должность")] public string PreviousPosition { get; set; } = "";
    [Display(Name = "Желаемая должность")] public string DesiredPosition { get; set; } = "";
    [Display(Name = "Мин. желаемая зарплата")] public decimal MinDesiredSalary { get; set; }
    [Display(Name = "Дата постановки на учёт")] public DateTime RegistrationDate { get; set; } = DateTime.Now;
    [Display(Name = "Семейное положение")] public string MaritalStatus { get; set; } = "";
    public override string ToString() => FullName;
}

public class VacancyApplication
{
    public int Id { get; set; }
    [Display(Name = "Соискатель")] public int ApplicantId { get; set; }
    [ForeignKey("ApplicantId")] public Applicant? Applicant { get; set; }
    [Display(Name = "Вакансия")] public int VacancyId { get; set; }
    [ForeignKey("VacancyId")] public Vacancy? Vacancy { get; set; }
    [Display(Name = "Дата отклика")] public DateTime ApplicationDate { get; set; } = DateTime.Now;
    [Display(Name = "Статус")] public ApplicationStatus Status { get; set; } = ApplicationStatus.НаРассмотрении;
}

// --- Контекст БД ---

public class EmploymentDb : DbContext
{
    public DbSet<Enterprise> Enterprises { get; set; }
    public DbSet<Vacancy> Vacancies { get; set; }
    public DbSet<Applicant> Applicants { get; set; }
    public DbSet<VacancyApplication> Applications { get; set; }
    public DbSet<AuditLog> AuditLogs { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(
            "Server=SERVER;Database=EmploymentDb;Trusted_Connection=true;TrustServerCertificate=true");
}

Полный рабочий пример: ИС "Библиотека"

Установка: dotnet add package ISBuilder + dotnet add package Microsoft.EntityFrameworkCore.SqlServer.

// Полный рабочий пример — один файл Program.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using AppBuilder;
using SeedKit;
using AuditKit;
using DataDictKit;
using TestCaseKit;

var db = new LibraryDb();
db.Database.EnsureCreated();

if (!db.Authors.Any())
{
    var rnd = new Random();

    var authors = new List<Author>();
    foreach (var name in new[] { "Толстой Л.Н.", "Достоевский Ф.М.", "Булгаков М.А.", "Пушкин А.С.",
        "Гоголь Н.В.", "Чехов А.П.", "Тургенев И.С.", "Гончаров И.А.", "Шолохов М.А.",
        "Лермонтов М.Ю.", "Куприн А.И.", "Бунин И.А.", "Горький М.", "Есенин С.А.", "Маяковский В.В." })
        authors.Add(new Author { Name = name });
    db.Authors.AddRange(authors);
    db.SaveChanges();

    var genres = new List<Genre>();
    foreach (var name in new[] { "Роман", "Повесть", "Рассказ", "Поэма", "Драма",
        "Детектив", "Фантастика", "Научная литература", "Учебник", "Справочник", "Биография" })
        genres.Add(new Genre { Name = name });
    db.Genres.AddRange(genres);
    db.SaveChanges();

    var publishers = new List<Publisher>();
    foreach (var name in new[] { "Эксмо", "АСТ", "Азбука", "Просвещение", "Дрофа",
        "Питер", "МИФ", "Росмэн", "Лениздат", "Молодая гвардия" })
        publishers.Add(new Publisher { Name = name });
    db.Publishers.AddRange(publishers);
    db.SaveChanges();

    var readers = Seeder.Generate<Reader>(40);
    foreach (var r in readers) r.Id = 0;
    db.Readers.AddRange(readers);
    db.SaveChanges();

    var authorList = db.Authors.ToList();
    var genreList = db.Genres.ToList();
    var pubList = db.Publishers.ToList();
    var bookTitles = new[] { "Война и мир", "Преступление и наказание", "Мастер и Маргарита",
        "Евгений Онегин", "Анна Каренина", "Мёртвые души", "Тихий Дон", "Идиот",
        "Отцы и дети", "Двенадцать стульев", "Капитанская дочка", "Герой нашего времени",
        "Обломов", "Собачье сердце", "Вишнёвый сад", "Гранатовый браслет",
        "Тёмные аллеи", "На дне", "Детство", "Ревизор",
        "Бесы", "Братья Карамазовы", "Записки из мёртвого дома", "Белая гвардия",
        "Дубровский", "Пиковая дама", "Нос", "Шинель", "Хаджи-Мурат", "Кавказский пленник" };

    foreach (var title in bookTitles)
    {
        db.Books.Add(new Book
        {
            Title = title,
            AuthorId = authorList[rnd.Next(authorList.Count)].Id,
            GenreId = genreList[rnd.Next(genreList.Count)].Id,
            PublisherId = pubList[rnd.Next(pubList.Count)].Id,
            LibraryCode = $"84({rnd.Next(2,5)})Р{rnd.Next(10,99)}",
            PublishYear = rnd.Next(1950, 2025),
            ISBN = $"978-5-{rnd.Next(10000,99999)}-{rnd.Next(100,999)}-{rnd.Next(0,9)}",
            TotalCopies = rnd.Next(2, 8)
        });
    }
    db.SaveChanges();

    var bookList = db.Books.ToList();
    foreach (var book in bookList)
    {
        for (int i = 0; i < book.TotalCopies; i++)
            db.BookCopies.Add(new BookCopy
            {
                BookId = book.Id,
                InventoryNumber = $"ИНВ-{rnd.Next(10000, 99999)}",
                Condition = (BookCondition)rnd.Next(0, 3)
            });
    }
    db.SaveChanges();

    var readerList = db.Readers.ToList();
    var copyList = db.BookCopies.Where(c => c.Condition != BookCondition.Списан).ToList();
    for (int i = 0; i < 60; i++)
    {
        var reader = readerList[rnd.Next(readerList.Count)];
        var copy = copyList[rnd.Next(copyList.Count)];
        var issueDate = DateTime.Now.AddDays(-rnd.Next(1, 90));
        var returned = rnd.Next(100) < 70;
        db.Loans.Add(new Loan
        {
            ReaderId = reader.Id, BookCopyId = copy.Id,
            IssueDate = issueDate, DueDate = issueDate.AddDays(30),
            ReturnDate = returned ? issueDate.AddDays(rnd.Next(1, 35)) : null,
            Status = returned ? LoanStatus.Возвращена : LoanStatus.Выдана
        });
    }
    db.SaveChanges();

    DataDictionary.GenerateDocx(db, "Словарь_данных_библиотека.docx");
    var cases = new List<TestCase>();
    cases.AddRange(TestCaseGenerator.GenerateCrud<Book>("Книги"));
    cases.AddRange(TestCaseGenerator.GenerateCrud<Reader>("Читатели"));
    cases.AddRange(TestCaseGenerator.GenerateCrud<BookCopy>("Экземпляры"));
    cases.AddRange(TestCaseGenerator.GenerateCrud<Loan>("Выдачи"));
    UniversalExport.ExportManager.Export(
        TestCaseGenerator.ToDataTable(cases, "Тест-кейсы"), "Тест_кейсы_библиотека.xlsx");
    Audit.Log(db, "БД создана, словарь и тест-кейсы сгенерированы", "system");
}

App.Create<LibraryDb>("ИС «Управление библиотекой»")
   .WithMenu()
   .WithDashboard(d => new[]
   {
       ("Книг",        (object)d.Books.Count(),      Color.FromArgb(142, 68, 173)),
       ("Читателей",   (object)d.Readers.Count(),    Color.FromArgb(41, 128, 185)),
       ("Экземпляров", (object)d.BookCopies.Count(),  Color.FromArgb(39, 174, 96)),
       ("Выдач",       (object)d.Loans.Count(),       Color.FromArgb(230, 126, 34))
   })
   .AddTab<Book>("Каталог книг")
   .AddTab<Author>("Авторы").AddTab<Genre>("Жанры").AddTab<Publisher>("Издательства")
   .AddTab<Reader>("Читатели").AddTab<BookCopy>("Экземпляры").AddTab<Loan>("Выдачи / Возвраты")
   .WithExport().WithSearch().WithStatusBar().Size(1280, 800).Run();

// --- Перечисления ---
public enum BookCondition
{
    [Display(Name = "Отличное")] Отличное, [Display(Name = "Хорошее")] Хорошее,
    [Display(Name = "Удовлетворительное")] Удовлетворительное, [Display(Name = "Списан")] Списан
}
public enum LoanStatus
{
    [Display(Name = "Выдана")] Выдана, [Display(Name = "Возвращена")] Возвращена,
    [Display(Name = "Просрочена")] Просрочена
}

// --- Справочники ---
public class Author
{
    public int Id { get; set; }
    [Display(Name = "ФИО автора"), Required] public string Name { get; set; } = "";
    public List<Book> Books { get; set; } = new();
    public override string ToString() => Name;
}
public class Genre
{
    public int Id { get; set; }
    [Display(Name = "Название жанра"), Required] public string Name { get; set; } = "";
    public List<Book> Books { get; set; } = new();
    public override string ToString() => Name;
}
public class Publisher
{
    public int Id { get; set; }
    [Display(Name = "Название издательства"), Required] public string Name { get; set; } = "";
    public List<Book> Books { get; set; } = new();
    public override string ToString() => Name;
}

// --- Модели ---
public class Book
{
    public int Id { get; set; }
    [Display(Name = "Название"), Required, StringLength(200)] public string Title { get; set; } = "";
    [Display(Name = "Автор")] public int AuthorId { get; set; }
    [ForeignKey("AuthorId")] public Author? Author { get; set; }
    [Display(Name = "Жанр")] public int GenreId { get; set; }
    [ForeignKey("GenreId")] public Genre? Genre { get; set; }
    [Display(Name = "Издательство")] public int PublisherId { get; set; }
    [ForeignKey("PublisherId")] public Publisher? Publisher { get; set; }
    [Display(Name = "Библиотечный шифр")] public string LibraryCode { get; set; } = "";
    [Display(Name = "Год издания")] public int PublishYear { get; set; }
    [Display(Name = "ISBN")] public string ISBN { get; set; } = "";
    [Display(Name = "Экземпляров")] public int TotalCopies { get; set; }
    public List<BookCopy> Copies { get; set; } = new();
    public override string ToString() => Title;
}
public class Reader
{
    public int Id { get; set; }
    [Display(Name = "ФИО"), Required] public string FullName { get; set; } = "";
    [Display(Name = "Читательский билет")] public string CardNumber { get; set; } = "";
    [Display(Name = "Телефон")] public string Phone { get; set; } = "";
    [Display(Name = "Дата выдачи билета")] public DateTime CardIssueDate { get; set; } = DateTime.Now;
    [Display(Name = "Перерегистрация")] public DateTime LastReregistration { get; set; } = DateTime.Now;
    [Display(Name = "Нарушитель")] public bool IsViolator { get; set; } = false;
    public override string ToString() => FullName;
}
public class BookCopy
{
    public int Id { get; set; }
    [Display(Name = "Инв. номер"), Required] public string InventoryNumber { get; set; } = "";
    [Display(Name = "Состояние")] public BookCondition Condition { get; set; } = BookCondition.Хорошее;
    [Display(Name = "Книга")] public int BookId { get; set; }
    [ForeignKey("BookId")] public Book? Book { get; set; }
    public override string ToString() => $"{InventoryNumber} ({Book?.Title ?? "?"})";
}
public class Loan
{
    public int Id { get; set; }
    [Display(Name = "Читатель")] public int ReaderId { get; set; }
    [ForeignKey("ReaderId")] public Reader? Reader { get; set; }
    [Display(Name = "Экземпляр")] public int BookCopyId { get; set; }
    [ForeignKey("BookCopyId")] public BookCopy? BookCopy { get; set; }
    [Display(Name = "Дата выдачи")] public DateTime IssueDate { get; set; } = DateTime.Now;
    [Display(Name = "Срок возврата")] public DateTime DueDate { get; set; }
    [Display(Name = "Дата возврата")] public DateTime? ReturnDate { get; set; }
    [Display(Name = "Статус")] public LoanStatus Status { get; set; } = LoanStatus.Выдана;
}

// --- Контекст ---
public class LibraryDb : DbContext
{
    public DbSet<Author> Authors { get; set; }
    public DbSet<Genre> Genres { get; set; }
    public DbSet<Publisher> Publishers { get; set; }
    public DbSet<Book> Books { get; set; }
    public DbSet<Reader> Readers { get; set; }
    public DbSet<BookCopy> BookCopies { get; set; }
    public DbSet<Loan> Loans { get; set; }
    public DbSet<AuditLog> AuditLogs { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(
            "Server=SERVER;Database=LibraryDb;Trusted_Connection=true;TrustServerCertificate=true");
}

Покрываемые предметные области (25+)

ISBuilder содержит инструменты для разработки информационных систем по любой предметной области:

Область Примеры сущностей
Служба занятости Вакансии, Соискатели, Предприятия, Отклики
Банк Клиенты, Кредиты, Вклады, Платежи
Гостиница Номера, Гости, Бронирования, Услуги
Магазин Товары, Заказы, Клиенты, Скидки
Транспорт Рейсы, Билеты, Пассажиры, Маршруты
Аптека Лекарства, Рецепты, Поставщики, Продажи
Поликлиника Врачи, Пациенты, Приемы, Диагнозы
Автосалон Автомобили, Клиенты, Продажи, Сервис
Библиотека Книги, Читатели, Выдачи, Авторы
Риелторское агентство Объекты, Клиенты, Сделки, Агенты
Турагентство Туры, Клиенты, Бронирования, Направления
Ресторан Блюда, Заказы, Столики, Официанты
Автосервис Автомобили, Заказ-наряды, Запчасти, Мастера
Склад Товары, Поступления, Отгрузки, Ячейки
Учебный центр Курсы, Студенты, Преподаватели, Оценки
Кинотеатр Фильмы, Сеансы, Залы, Билеты
Салон красоты Услуги, Мастера, Клиенты, Записи
Фитнес-клуб Абонементы, Клиенты, Тренеры, Занятия
Страховая компания Полисы, Клиенты, Выплаты, Агенты
Доставка еды Блюда, Заказы, Курьеры, Рестораны
Ветеринарная клиника Животные, Владельцы, Приемы, Лечение
Прокат автомобилей Автомобили, Клиенты, Аренда, Тарифы
Управляющая компания ЖКХ Дома, Жильцы, Платежи, Заявки
Спортивная школа Секции, Тренеры, Ученики, Соревнования
Издательство Книги, Авторы, Тиражи, Продажи

Как использовать (How To)

Шаг 1. Создать проект

dotnet new winforms -n MyApp
cd MyApp

Шаг 2. Установить ISBuilder

dotnet add package ISBuilder

Все 27 пакетов установятся автоматически.

Шаг 3. Создать модели данных

Создайте классы сущностей по вашей предметной области:

public class Vacancy
{
    public int Id { get; set; }
    public string Position { get; set; }
    public decimal Salary { get; set; }
    public string EmploymentType { get; set; }
    public DateTime PublishedDate { get; set; }
    public int EnterpriseId { get; set; }
}

Шаг 4. Создать DbContext

using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public DbSet<Vacancy> Vacancies { get; set; }
    public DbSet<AuditKit.AuditLog> AuditLogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(
            "Server=.;Database=MyAppDb;Trusted_Connection=true;TrustServerCertificate=true");
}

Шаг 5. Создать и заполнить БД

using MigrationKit;
using SeedKit;

var db = new MyDbContext();
await DbHelper.EnsureCreatedAsync(db);        // создать БД
var data = Seeder.Generate<Vacancy>(50);       // сгенерировать тестовые данные
db.Vacancies.AddRange(data);
db.SaveChanges();

Шаг 6. Запустить приложение

using AppBuilder;

App.Create<MyDbContext>("Моя информационная система")
   .WithMenu()
   .WithDashboard(db => new[] {
       ("Записей", (object)db.Vacancies.Count(), Color.FromArgb(52,152,219))
   })
   .AddTab<Vacancy>("Вакансии")
   .WithExport()
   .WithSearch()
   .WithStatusBar()
   .Size(1200, 750)
   .Run();

Шаг 7. Добавить дополнительные функции

// Отчет в PDF
var vacancies = db.Vacancies.ToList();
var dt = UniversalExport.ExportManager.ToDataTable(vacancies);
Report.Create("Отчет").AddTable(dt).AddSummary("Salary").SavePdf("report.pdf");

// Диаграмма
var chart = SimpleChart.Bar(dt, "Position", "Salary", "Зарплаты");

// Расчет
decimal benefit = BizCalc.UnemploymentBenefit(70000, 4);

// Подбор
var matches = Matcher.FindWithScore(vacancies,
    new MatchRule("Salary", ">=", 60000, weight: 3));

// Аудит
Audit.Log(db, "Экспорт данных", "admin");

// Планировщик
TaskScheduler.Daily(new TimeOnly(9, 0), () => CheckStaleRecords());

Лицензия

MIT

Product Compatible and additional computed target framework versions.
.NET net8.0-windows7.0 is compatible.  net9.0-windows was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
8.7.2 113 4/13/2026
8.7.1 95 4/12/2026
8.7.0 99 4/12/2026
8.6.9 104 4/12/2026
8.6.8 100 4/12/2026
8.6.7 95 4/12/2026
8.6.6 96 4/12/2026
8.6.5 99 4/12/2026
8.6.4 93 4/12/2026