Managing Large Models
Your OttoModel<T>
-derived classes may become unwieldy and complex over time as your GraphQL model reaches a certain level of maturity. When this happens, you can spread the model configuration across a number of different classes using IGraphTypeConfigurator<TModel, TType>
in combination with the LoadConfigurators(...)
method on OttoModel<T>
:
public sealed class Model : OttoModel<Query>
{
protected override SchemaBuilder ConfigureSchema(SchemaBuilder builder)
{
return LoadConfigurators(this.GetType().Assembly, builder);
}
}
public sealed class Configurator : IGraphTypeConfigurator<Model, Query>
{
public GraphTypeBuilder<Query> Configure(GraphTypeBuilder<Query> builder)
{
return builder
.LooseScalarField(x => x.Child)
.ResolvesVia<Resolver>()
;
}
}
You are free to implement as many different IGraphTypeConfigurator<TModel,TType>
interfaces as you want on a single class; for instance:
public sealed class Configurator
: IGraphTypeConfigurator<Model, Type1>
, IGraphTypeConfigurator<Model, Type2>
, IGraphTypeConfigurator<Model, Type3>
{
public GraphTypeBuilder<Type1> Configure(GraphTypeBuilder<Type1> builder)
{ /* implementation */ }
public GraphTypeBuilder<Type2> Configure(GraphTypeBuilder<Type2> builder)
{ /* implementation */ }
public GraphTypeBuilder<Type3> Configure(GraphTypeBuilder<Type3> builder)
{ /* implementation */ }
}
The only caveat is that the first type argument must be the exact same type as your OttoModel<T>
-derived model class - inheritance does not apply here. In other words, a class implementing IGraphTypeConfigurator<OttoModel<Query>, Query>
will not be loaded by Model
.