A custom DataLoader is a class that derives from
DataLoaderBase<TKey, TValue>
and implements FetchData
. This is very useful,
not just in DI (Dependency Injection) scenarios, because the data fetching
logic is defined inside the custom DataLoader itself; therefore, must not be
provided repeatedly when creating new instances.
Creating a custom DataLoader is not that difficult. First of all we should create a dedicated marker interface for separation purposes.
public interface IUserDataLoader : IDataLoader<string, User>{ }
Although the extra interface IUserDataLoader
isn't necessarily required, we
strongly recommend to create an extra interface in this particular case because
of several reasons. One reason is you might have a handful of DataLoader which
implementing a completely different data fetching logic, but from the outside
they look identic due to their identic type parameter list. That's why we should
always create a separate interface for each DataLoader. We just mentioned one
reason here because the explanation would go beyond the scope of custom
DataLoader.
Last but not least, we have to create a new class deriving from
DataLoaderBase<TKey, TValue>
and implementing our marker interface.
public class UserDataLoader : DataLoaderBase<string, User> , IUserDataLoader{ protected override Task<IReadOnlyList<Result<User>>> Fetch( IReadOnlyList<string> keys) { // Here goes our data fetching logic }}