Built-in template catalog
Every template shipped with Socotra. All share the namespace Socotra.Templates.Shared.
1. base-entity
Purpose: Abstract base class for domain entities with common audit fields.
Files: BaseEntity.cs
#nullable enable
namespace Socotra.Templates.Shared;
public abstract class BaseEntity
{
public Guid Id { get; protected set; } = Guid.NewGuid();
public DateTime CreatedAt { get; protected set; } = DateTime.UtcNow;
public DateTime? UpdatedAt { get; protected set; }
}2. value-object
Purpose: Abstract base class for value objects with IEquatable<T> support.
Files: ValueObject.cs
#nullable enable
namespace Socotra.Templates.Shared;
public abstract class ValueObject : IEquatable<ValueObject>
{
public abstract bool Equals(ValueObject? other);
public abstract override int GetHashCode();
public static bool operator ==(ValueObject? left, ValueObject? right)
{
if (left is null && right is null) return true;
if (left is null || right is null) return false;
return left.Equals(right);
}
public static bool operator !=(ValueObject? left, ValueObject? right) => !(left == right);
public override bool Equals(object? obj) => Equals(obj as ValueObject);
}3. aggregate-root
Purpose: Aggregate root extending BaseEntity with domain event support.
Files: AggregateRoot.cs, DomainEvent.cs
#nullable enable
namespace Socotra.Templates.Shared;
public abstract class AggregateRoot : BaseEntity
{
private readonly List<DomainEvent> _domainEvents = new();
public IReadOnlyList<DomainEvent> DomainEvents => _domainEvents.AsReadOnly();
protected void RaiseEvent(DomainEvent domainEvent) => _domainEvents.Add(domainEvent);
public void ClearEvents() => _domainEvents.Clear();
}4. domain-event
Purpose: Base record for domain events with OccurredAt timestamp.
Files: DomainEvent.cs
#nullable enable
namespace Socotra.Templates.Shared;
public abstract record DomainEvent
{
public DateTime OccurredAt { get; protected set; } = DateTime.UtcNow;
}5. command
Purpose: Marker interface for CQRS commands.
Files: ICommand.cs
#nullable enable
namespace Socotra.Templates.Shared;
public interface ICommand { }6. query
Purpose: Marker interface for CQRS queries.
Files: IQuery.cs
#nullable enable
namespace Socotra.Templates.Shared;
public interface IQuery { }7. repository-interface
Purpose: Generic CRUD repository interface.
Files: IRepository.cs
#nullable enable
namespace Socotra.Templates.Shared;
public interface IRepository<T> where T : class
{
Task<T?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
Task<IReadOnlyList<T>> GetAllAsync(CancellationToken cancellationToken = default);
Task AddAsync(T entity, CancellationToken cancellationToken = default);
Task UpdateAsync(T entity, CancellationToken cancellationToken = default);
Task DeleteAsync(T entity, CancellationToken cancellationToken = default);
}8. result-pattern
Purpose: Result and Result<T> types for explicit error handling without exceptions.
Files: Result.cs
#nullable enable
namespace Socotra.Templates.Shared;
public class Result
{
public bool IsSuccess { get; }
public bool IsFailure => !IsSuccess;
public string? Error { get; }
protected Result(bool isSuccess, string? error)
{
IsSuccess = isSuccess;
Error = error;
}
public static Result Success() => new(true, null);
public static Result Failure(string error) => new(false, error);
}
public class Result<T> : Result
{
public T? Value { get; }
protected Result(T value) : base(true, null) => Value = value;
private Result(string error) : base(false, error) { }
public static Result<T> Success(T value) => new(value);
public static new Result<T> Failure(string error) => new(error);
}9. ef-context
Purpose: Entity Framework Core DbContext stub ready for extension.
Files: AppDbContext.cs
#nullable enable
using Microsoft.EntityFrameworkCore;
namespace Socotra.Templates.Shared;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}10. di-registration
Purpose: Dependency injection extension method stub for IServiceCollection.
Files: DependencyInjection.cs
#nullable enable
using Microsoft.Extensions.DependencyInjection;
namespace Socotra.Templates.Shared;
public static class DependencyInjection
{
public static IServiceCollection AddInfrastructure(this IServiceCollection services)
{
return services;
}
}