❔ Builder with generics
Is possible create a builder that have classes with different parameters?
An example
Compiler error,
An example
public class CommandHandlerFactory
{
private readonly ICommandHandler<CreateGoogleAccountCommand> _googleAccountCommandHandler;
private readonly ICommandHandler<CreateYahooAccountCommand> _yahooAccountCommandHandler;
public CommandHandlerFactory(ICommandHandler<CreateGoogleAccountCommand> googleAccountCommandHandler, ICommandHandler<CreateYahooAccountCommand> yahooAccountCommandHandler)
{
_googleAccountCommandHandler = googleAccountCommandHandler;
_yahooAccountCommandHandler = yahooAccountCommandHandler;
}
public ICommandHandler<T> Build<T>(ProviderAvaiablesEnum providers) where T : ICommand
{
var builder = new Dictionary<ProviderAvaiablesEnum, ICommandHandler<T>>
{
{ ProviderAvaiablesEnum.Google, _googleAccountCommandHandler },
{ ProviderAvaiablesEnum.Yahoo _yahooAccountCommandHandler },
};
return builder[providers];
}
}
// Command Handler interface
public interface ICommandHandler<in T> where T : ICommand
{
Task<CommandResult> Execute(T command, CancellationToken cancellationToken = default);
}
// Command interface
public interface ICommand
{
public ProviderAvaiablesEnum ProviderAvaiables { get; set; }
}
// Yahoo interface
public class CreateYahooAccountCommand : ICommand
{
public ProviderAvaiablesEnum ProviderAvaiables { get; set; } = ProviderAvaiablesEnum.Yahoo
....
}public class CommandHandlerFactory
{
private readonly ICommandHandler<CreateGoogleAccountCommand> _googleAccountCommandHandler;
private readonly ICommandHandler<CreateYahooAccountCommand> _yahooAccountCommandHandler;
public CommandHandlerFactory(ICommandHandler<CreateGoogleAccountCommand> googleAccountCommandHandler, ICommandHandler<CreateYahooAccountCommand> yahooAccountCommandHandler)
{
_googleAccountCommandHandler = googleAccountCommandHandler;
_yahooAccountCommandHandler = yahooAccountCommandHandler;
}
public ICommandHandler<T> Build<T>(ProviderAvaiablesEnum providers) where T : ICommand
{
var builder = new Dictionary<ProviderAvaiablesEnum, ICommandHandler<T>>
{
{ ProviderAvaiablesEnum.Google, _googleAccountCommandHandler },
{ ProviderAvaiablesEnum.Yahoo _yahooAccountCommandHandler },
};
return builder[providers];
}
}
// Command Handler interface
public interface ICommandHandler<in T> where T : ICommand
{
Task<CommandResult> Execute(T command, CancellationToken cancellationToken = default);
}
// Command interface
public interface ICommand
{
public ProviderAvaiablesEnum ProviderAvaiables { get; set; }
}
// Yahoo interface
public class CreateYahooAccountCommand : ICommand
{
public ProviderAvaiablesEnum ProviderAvaiables { get; set; } = ProviderAvaiablesEnum.Yahoo
....
}Compiler error,
Argument type 'Account.Importer.Domain.Commands.Contracts.ICommandHandler<Account.Importer.Domain.Commands.Contracts.CreateGoogleAccountCommand>' is not assignable to parameter type 'Account.Importer.Domain.Commands.Contracts.ICommandHandler<T>'Argument type 'Account.Importer.Domain.Commands.Contracts.ICommandHandler<Account.Importer.Domain.Commands.Contracts.CreateGoogleAccountCommand>' is not assignable to parameter type 'Account.Importer.Domain.Commands.Contracts.ICommandHandler<T>'