0

Is there a way I can write the following class such that the setting of DataService, ExpenseType and VatRatesSource need be coded only once:

public class NewExpenseViewModel
{
    private readonly IDataService DataService;

    public ExpenseType ExpenseType { get; set; }

    CollectionViewSource VatRatesSource { get; set; }
    public ICollectionView VatRatesView => VatRatesSource.View;
    private IEnumerable<VatRate> VatRates => (IEnumerable<VatRate>)VatRatesSource.Source;

    public NewExpenseViewModel(ServiceProvider serviceProvider, ExpenseType expenseType, VatRate vatRate)
    {
        DataService = serviceProvider.GetService<IDataService>();

        ExpenseType = expenseType;

        VatRatesSource = new CollectionViewSource() { Source = DataService.GetVatRates() };

        VatRate = VatRates.FirstOrDefault(v => v.VatRateID.Equals(vatRate.VatRateID));
    }

    public NewExpenseViewModel(ServiceProvider serviceProvider, ExpenseType expenseType)
    {
        DataService = serviceProvider.GetService<IDataService>();

        ExpenseType = expenseType;

        VatRatesSource = new CollectionViewSource() { Source = DataService.GetVatRates() };

        VatRate = VatRates.FirstOrDefault(v => v.VatRateID.Equals(ExpenseType.SuggestedVatRateID));
    }
}
Chris Mack
  • 5,148
  • 2
  • 12
  • 29
  • I've updated my answer here: https://stackoverflow.com/a/58923549/55774 – Frederik Gheysels Nov 18 '19 at 22:36
  • 2
    Still Constructor Chaining. You go from the Constructor with the least arguments to the one with the most, adding default values as you go. – Christopher Nov 18 '19 at 22:38
  • Thanks, both, I arrived at a solution which I have posted on the original thread: https://stackoverflow.com/questions/58923510/c-sharp-constructors-having-both-shared-and-different-code/58924114#58924114 – Chris Mack Nov 18 '19 at 22:55

0 Answers0