Is possible create a builder that have classes with different parameters? 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 interfacepublic interface ICommandHandler<in T> where T : ICommand{ Task<CommandResult> Execute(T command, CancellationToken cancellationToken = default);}// Command interfacepublic interface ICommand{ public ProviderAvaiablesEnum ProviderAvaiables { get; set; }}// Yahoo interfacepublic 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 interfacepublic interface ICommandHandler<in T> where T : ICommand{ Task<CommandResult> Execute(T command, CancellationToken cancellationToken = default);}// Command interfacepublic interface ICommand{ public ProviderAvaiablesEnum ProviderAvaiables { get; set; }}// Yahoo interfacepublic 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>'