C#C
C#3y ago
rcnespoli

❔ Builder with generics

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 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>'
Was this page helpful?