Socotra
Templates

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

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

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

AggregateRoot.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

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

ICommand.cs
#nullable enable
namespace Socotra.Templates.Shared;

public interface ICommand { }

6. query

Purpose: Marker interface for CQRS queries.

Files: IQuery.cs

IQuery.cs
#nullable enable
namespace Socotra.Templates.Shared;

public interface IQuery { }

7. repository-interface

Purpose: Generic CRUD repository interface.

Files: IRepository.cs

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

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

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

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;
    }
}
Schema 1.1 · CLI 1.0