This post has been imported from my previous blog. I did my best to parse XML properly, but it might have some errors.
If you find one, send a Pull Request.
In the previous posts I described the intentions behind Themis. It’s time do deepen into demand and the whole configuration. Imagine a domain of car drivers. It includes car drivers as well as driven cars. The simplest demand which one can come up with is a simple check, whether one can drive a specific car.
public class CanDrive : IDemand<bool>
{
public CanDrive(Car car)
{
Car = car;
}
public Car Car { get; private set; }
}
Speaking about a car and car driver:
public class DriverRole
{
public DriverRole(int skillLevel)
{
SkillLevel = skillLevel;
}
public int SkillLevel { get; private set; }
}
public class Car
{
public Car(int requiredSkillLevel)
{
RequiredSkillLevel = requiredSkillLevel;
}
public int RequiredSkillLevel { get; private set; }
}
The last but one thing, which should b e done is to create a defintion of the DriverRole. By creating a definition I mean, creating a set of rules applied to evaluated demands in scope of the role context:
public class DriverRoleDefinition : RoleDefinition<DriverRole>
{
public DriverRoleDefinition( )
{
Add<CanDrive, bool>((d, r) => d.Car.RequiredSkillLevel <= r.SkillLevel);
}
}
Having all of this, during application startup one can easily configure the demand service with fluent configuration:
var demandService = Fluently.Configure()
.AddRoleDefinition(new DriverRoleDefinition())
.BuildDemandService();
and use the created service to evaluate demand canDrive created on a retrieved car basis, passing the driver role as the argument
return _demandService.Evaluate<CanDrive, bool>(canDrive, driverRole).Any(b=>b);
In the solution, I created a more meaningful example (Themis.Example project), showing how with simple extension methods get rid of plenty of generic parameters.
In the next posts I’ll write about Themis extension points and describe a way in which I want to integrate it with NHibernate.