standards-c-sharp

Service design

Interfaces

Unnecessary interfaces pollute the codebase and make it more difficult to understand.

Injection and mocking

Static methods

Dependencies

Example

Say we have a model that needs to be mapped to a view model:

public class MyModel
{
    public int Id { get; set; }
}

public class MyViewModel
{
    public int ModelId { get; set; }
}

Don’t

// so interface, much dependencies...

interface IViewModelMapper<TFrom, TTo>
{
    TTo Map(TFrom from);
}

public class MyViewModelMapper : IViewModelMapper<MyModel, MyViewModel>
{
    public MyViewModel Map(MyModel model)
    {
        return new MyViewModel
        {
            ModelId = model.Id
        };
    }
}

public class MyController
{
    private MyViewModelMapper mapper;
    private IMyService service;
    
    public MyService(MyViewModelMapper mapper, IMyService service)
    {
        this.mapper = mapper;
        this.service = service;
    }
    
    public MyViewModel Get()
    {
        var model = service.GetModel();
        var viewModel = mapper.Map(model);
        return Json(viewModel);
    }

Do

// KISS

public class MyViewModel
{
    public int Id { get; set; }

    // Method is pure, so doesn't need to be mocked or injected -> make it static:
    public static MyViewModel From(MyModel model)
    {
        return new MyViewModel
        {
            ModelId = model.Id
        };
    }      
}

public class MyController : ApiController
{
    private IMyService service;
    
    // We removed an unnecessarily injected dependency!
    public MyService(IMyService service)
    {
        this.service = service;
    }
    
    public MyViewModel Get()
    {
        var model = service.GetModel();
        var viewModel = MyViewModel.From(model);
        return Json(viewModel);
    }
}