The documentation states:
This lifestyle can be simulated by using one of the Scoped lifestyles.
In other words, Simple Injector does not contain a PerGraph lifestyle out of the box (the documentation isn't really explicit about this, so it might need to be improved a bit). The trick is to select the proper scoped lifestyle (depending on your requirements) and (implicitly or explicitly) start a scope and resolve the graph. For instance:
var scopedLifestyle = new AsyncScopedLifestyle();
container.Register<ISomeType, SomeType>(scopedLifestyle);
using (AsyncScopedLifestyle.BeginScope(container))
{
var some = container.GetInstance<SomeRootObjectDependingOnSomeType>();
some.Execute();
}
The main reason why a per graph lifestyle doesn't exist in Simple Injector is because it can be very unreliable. If building of part of the graph is delayed (for instance because of the use of a Lazy<T>, Func<T>, or a call back into the container) this results in a new graph and therefore a new per graph instance. This is easy to miss and it is impossible for the Simple Injector diagnostic services to warn about this. Therefore it is much safer and clearer to explicitly define a scope yourself.