Unnecessary interfaces pollute the codebase and make it more difficult to understand.
DateTime.Now
).[RegisterSingleton]
rather than registering directly with the container.DependencyResolver.Current
. Inject your dependency through the constructor. Read more.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; }
}
// 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);
}
// 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);
}
}