Advanced Usage
Sample interfaces/classes used can be found at the bottom of this page.
All samples assumes that you have included the namespace for the static Crosser.Resolver container.
// include the namespace
using Crosser.Resolve;
Dependency Injection
If you take a look at the sample classes you can see a common way to decouple concrete implementation from each other. Basically all we do is using the interfaces instad of the concrete type so that we can change the implementation with minimal efforts.
Register
Register the ICarService to CarService, also pass ICarRepository to the ctor since it needs one
One<ICarService>.As(()=>new CarService(One<ICarRepository>.Get()));
Register the ICarRepository to CarRepository so that the mapping above will be ok
One<ICarRepository>.As(()=> new CarRepository());
Resolve
Now when we ask for the ICarService we will get a CarService with the ICarRepository registered
var carService = One<ICarService>.Get();
foreach(var car in carService.GetFastestCars(3))
{
Console.WriteLine("Name: {0}, Speed: {1}",car.Name, car.TopSpeed);
}
Property Injection
Above we used Dependency Injection by passing interfaces on the constructor, but we could also do Property Injection if the interface we map has public properties.
Interfaces
public interface ISomeInterface
{
IAnotherInterface SomeProperty {get;set;}
}
public interface IAnotherInterface
{
}
Register
One<ISomeInterface>.As(()=>new SomeInterfaceImplementation{SomeProperty = One<IAnotherInterface>.Get();});
One<IAnotherInterface>.As(()=> new AnotherInterfaceImplementation());
Resolve
// TODO: To test this... Implement ISomeInterface in SomeInterfaceImplementation and IAnotherInterface in SomeProperty
Sample Code
interfaces and classes used in this page
Model
public class Car
{
public int Id{get;set;}
public string Name{get;set;}
public int TopSpeed{get;set;}
}
Interfaces
public interface ICarService
{
IEnumerable<Car> GetFastestCars(int maxHits);
}
public interface ICarRepository
{
IEnumerable<Car> GetFastestCars(int maxHits);
}
implementations
public class CarRepository : ICarRepository
{
public IEnumerable<Car> GetFastestCars(int maxHits = 3)
{
return new List<Car>(){
new Car{Id = 1, Name="Ferrari 1", TopSpeed=365},
new Car{Id = 2, Name="Ferrari 2", TopSpeed=400},
new Car{Id = 3, Name="Ferrari 3", TopSpeed=332},
new Car{Id = 4, Name="Ferrari 4", TopSpeed=450},
new Car{Id = 5, Name="Ferrari 5", TopSpeed=320},
}.OrderByDescending(p => p.TopSpeed).Take(maxHits);
}
}
public class CarService : ICarService
{
protected ICarRepository Repository;
public CarService(ICarRepository repository)
{
Repository = repository;
}
public IEnumerable<Car> GetFastestCars(int maxHits = 3)
{
return this.Repository.GetFastestCars(maxHits);
}
}