Class that calls initiates the validation of itself and then initiates the assignment of offers
Is it bad practice to throw an exception if validation fails? Is there a better way to notify the user if validation fails?


It depends but usually validations return some kind of a validation result.




  Does this class have too many responsibilities i.e. validate and assign offers.


Actually not. They are not the responsibilities of this class. Validation is injected and provided via a service so it's fine.

I would worry more about its design.

The constructor requries two parameters but their corresponding properties are not readonly so you could just use them. More appropriate would to use fields or make the properties get only and private.




public void AssignOffers()
{
    ValidationResult results = _validator.Validate(this);
    if (results.IsValid)
    {
        _assignedOffers = _rulesOfferCalculator.CalculateOffers(this);
    }
    else
    {
        _validator.ValidateAndThrow(this);
    }
}



It's a weird process. It first validates the object and then calculate the offer. The Offer property should be a getter-only property and use the calculator to get the value and the validation should take place where the other properties necessary for the calculation are set because they need to be validated as apparently they can be invalid.