一键导入
core-principles
Fundamental coding principles for production development including SOLID, DRY, KISS, and common design patterns with C# examples.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Fundamental coding principles for production development including SOLID, DRY, KISS, and common design patterns with C# examples.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Build production-ready AI agents with Microsoft Foundry and Agent Framework. Covers agent architecture, model selection, orchestration, tracing, and evaluation.
Design robust REST APIs with proper versioning, pagination, error handling, rate limiting, and OpenAPI documentation.
Structure projects for maintainability and scalability with clean architecture, separation of concerns, and consistent project layouts.
Systematic code review and audit practices including automated checks, security audits, compliance verification, and review checklists.
Manage application configuration with environment variables, Azure Key Vault, feature flags, and environment-specific settings.
Efficient database operations with PostgreSQL, Entity Framework Core, migrations, indexing strategies, transactions, and connection pooling.
| name | core-principles |
| description | Fundamental coding principles for production development including SOLID, DRY, KISS, and common design patterns with C# examples. |
Purpose: Fundamental principles guiding production code development.
Focus: SOLID, DRY, KISS, design patterns.
Each class has one reason to change.
// ❌ Multiple responsibilities
public class User
{
public string Name { get; set; }
public void SaveToDatabase() { } // Persistence
public void SendEmail() { } // Communication
}
// ✅ Single responsibility
public class User
{
public string Name { get; set; }
}
public class UserRepository
{
public void Save(User user) { }
}
public class EmailService
{
public void SendEmail(User user) { }
}
Open for extension, closed for modification.
// ✅ Extend via abstraction
public interface IPaymentProcessor
{
Task<PaymentResult> ProcessAsync(decimal amount);
}
public class CreditCardProcessor : IPaymentProcessor { }
public class PayPalProcessor : IPaymentProcessor { }
public class PaymentService
{
public async Task ProcessPaymentAsync(IPaymentProcessor processor, decimal amount)
{
return await processor.ProcessAsync(amount);
}
}
Subtypes must be substitutable for base types.
// ✅ Derived classes extend, don't break behavior
public abstract class Bird
{
public abstract void Move();
}
public class Sparrow : Bird
{
public override void Move() => Fly();
}
public class Penguin : Bird
{
public override void Move() => Walk(); // Different but valid
}
Many specific interfaces > one general interface.
// ❌ Fat interface
public interface IWorker
{
void Work();
void Eat();
void Sleep();
}
// ✅ Segregated interfaces
public interface IWorkable { void Work(); }
public interface IFeedable { void Eat(); }
public interface IRestable { void Sleep(); }
Depend on abstractions, not concretions.
// ✅ Depend on interface
public class OrderService
{
private readonly IOrderRepository _repository;
public OrderService(IOrderRepository repository)
{
_repository = repository;
}
}
// ❌ Duplication
public class UserService
{
public User GetUser(int id)
{
var conn = new SqlConnection(connectionString);
conn.Open();
// ... query logic
}
public Order GetOrder(int id)
{
var conn = new SqlConnection(connectionString);
conn.Open();
// ... query logic
}
}
// ✅ Extract common logic
public abstract class BaseRepository
{
protected SqlConnection GetConnection()
{
var conn = new SqlConnection(connectionString);
conn.Open();
return conn;
}
}
// ❌ Overengineered
public class UserValidator
{
public bool Validate(User user)
{
var strategy = ValidatorStrategyFactory
.CreateStrategy(user.UserType)
.GetValidationChain()
.Execute(new ValidationContext(user));
return strategy.IsValid;
}
}
// ✅ Simple
public class UserValidator
{
public bool Validate(User user)
{
return !string.IsNullOrEmpty(user.Email) &&
user.Email.Contains("@") &&
user.Age >= 13;
}
}
Don't build features "just in case". Build what's needed now.
public interface IRepository<T>
{
Task<T?> GetByIdAsync(int id);
Task<IEnumerable<T>> GetAllAsync();
Task AddAsync(T entity);
}
public class UserRepository : IRepository<User>
{
private readonly AppDbContext _context;
public UserRepository(AppDbContext context) => _context = context;
public async Task<User?> GetByIdAsync(int id) =>
await _context.Users.FindAsync(id);
}
public interface IPaymentProcessorFactory
{
IPaymentProcessor Create(string type);
}
public class PaymentProcessorFactory : IPaymentProcessorFactory
{
public IPaymentProcessor Create(string type) => type switch
{
"credit_card" => new CreditCardProcessor(),
"paypal" => new PayPalProcessor(),
_ => throw new ArgumentException("Invalid payment type")
};
}
public interface IPricingStrategy
{
decimal CalculatePrice(decimal basePrice);
}
public class RegularPricing : IPricingStrategy
{
public decimal CalculatePrice(decimal basePrice) => basePrice;
}
public class DiscountPricing : IPricingStrategy
{
public decimal CalculatePrice(decimal basePrice) => basePrice * 0.9m;
}
See Also: 08-code-organization.md • 02-testing.md
Last Updated: January 13, 2026