Skip to content

Instantly share code, notes, and snippets.

@vkhorikov
vkhorikov / TelemetryOperation2.cs
Created June 19, 2025 10:41
TelemetryOperation wrapper v2
public class TelemetryOperation : IDisposable
{
private readonly IOperationHolder<RequestTelemetry> _operation;
private bool _disposed = false;
public TelemetryOperation(TelemetryClient telemetryClient, string operationName, object? properties = null)
{
var reqId = Guid.NewGuid().ToString("N");
_operation = telemetryClient.StartOperation<RequestTelemetry>(operationName, reqId);
@vkhorikov
vkhorikov / TelemetryOperation.cs
Created June 19, 2025 10:38
TelemetryOperation wrapper
public class TelemetryOperation : IDisposable
{
private readonly IOperationHolder<RequestTelemetry> _operation;
private bool _disposed = false;
public TelemetryOperation(TelemetryClient telemetryClient, string operationName, Dictionary<string, string> properties)
{
var reqId = Guid.NewGuid().ToString("N");
_operation = telemetryClient.StartOperation<RequestTelemetry>(operationName, reqId);
@vkhorikov
vkhorikov / EnumerationSample.cs
Created December 22, 2020 13:07
A sample implementation of the Enumeration pattern
public abstract class PoolType : ValueObject
{
public static readonly PoolType Quant = new QuantPoolType();
public static readonly PoolType Verbal = new VerbalPoolType();
public static readonly PoolType IR = new IRPoolType();
public static readonly PoolType Awa = new AwaPoolType();
public static readonly PoolType[] AllTypes = { Quant, Verbal, IR, Awa };
public abstract int Id { get; }
public abstract int Size { get; }
@vkhorikov
vkhorikov / 1.cs
Last active August 22, 2019 12:27
You are naming your tests wrong
[MethodUnderTest]_[Scenario]_[ExpectedResult]
@vkhorikov
vkhorikov / 1.cs
Created July 2, 2019 02:47
Decorators for both commands and queries
public sealed class DatabaseCommandRetryDecorator<TCommand> : DatabaseRetryDecorator, ICommandHandler<TCommand>
where TCommand : ICommand
{
private readonly ICommandHandler<TCommand> _handler;
public DatabaseCommandRetryDecorator(ICommandHandler<TCommand> handler, Config config)
: base(config)
{
_handler = handler;
}
@vkhorikov
vkhorikov / 1.cs
Last active June 6, 2019 18:28
Merging domain events
public sealed class Messages
{
private readonly IServiceProvider _provider;
public Messages(IServiceProvider provider)
{
_provider = provider;
}
public void Dispatch(IDomainEvent domainEvent)
@vkhorikov
vkhorikov / 1.cs
Last active April 15, 2019 21:35
CQRS and exception handling
public class EditPersonalInfoCommandHandler : ICommandHandler<EditPersonalInfoCommand>
{
public Result Handle(EditPersonalInfoCommand command)
{
for (int i = 0; ; i++)
{
try
{
var unitOfWork = new UnitOfWork(_sessionFactory);
Student student = unitOfWork.GetStudentById(command.Id);
@vkhorikov
vkhorikov / 1.cs
Last active February 20, 2019 16:12
When to validate commands in CQRS
public sealed class EnrollCommand : ICommand
{
public long StudentId { get; }
public string Course { get; }
public string Grade { get; }
public EnrollCommand(long studentId, string course, string grade)
{
if (course == null || grade == null) // Precondition checks
throw ArgumentException();
@vkhorikov
vkhorikov / 1.cs
Last active January 29, 2019 17:37
Are CQRS commands part of the domain model?
public IActionResult EditPersonalInfo([FromBody] EditPersonalInfoCommand command)
{
var handler = new EditPersonalInfoCommandHandler(_unitOfWork);
Result result = handler.Handle(command);
return result.IsSuccess ? Ok() : Error(result.Error);
}
@vkhorikov
vkhorikov / full.cs
Last active April 4, 2021 10:19
Hierarchy of value objects - full code
public class Person : Entity
{
public virtual string Name { get; set; }
private readonly DocumentContainer _document;
public virtual Document Document
{
get => _document.Document;
set => _document.Document = value;
}