I have two types, i.e AdditionCalc
and AggregateCalc
which have two methods:
- Calculate: Returns Model. No version code.
- Calculate: Doesn't return anything. Includes Versioning code. Stores the data in database.
Code :
public abstract class BaseCalculator
{
private readonly IVersion _version;
protected BaseCalculator(IVersion version)
{
this._version = version;
}
public void Calculate(Request r)
{
CalculateInternal();
//version code here
}
protected abstract void CalculateInternal(Request r);
public abstract StatisticsModel Calculate(StatisticsRequest model);
}
public class AdditionCalc : BaseCalculator
{
public AdditionCalc() : base(new Version(ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString)) { }
public override StatisticsModel Calculate(StatisticsRequest model)
{
//no version code here
}
}
public class CalculatorFactory
{
public BaseCalculator GetCalculatorByType(int type)
{
switch (type)
{
case (int)Types.Addition:
return new AdditionCalc();
case (int)Types.Aggregate:
return new AggregateCalc();
}
}
}
Now the problem is when I call Calculate
method which returns StatisticsModel
, I don't want to call base constructor because for this method I don't require version code, but every time when I call this method, the default constructor gets called and it initializes the version variable of base class
.
This is how I am calling the appropriate Calculate
method:
var calculatorFactory = new CalculatorFactory();
var type = calculatorFactory.GetCalculatorByType((int)Types.Addition);
type.Calculate(StatisticsRequest);
Note: I don't want to pass version dependency from calling code.
So how do I design the above code so that Version code doesn't get called for Calculate
method which returns StatisticsModel
?
Update :
public class AdditionCalc : BaseCalculator
{
public AdditionCalc() : base(new Version(ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString)) { }
public override StatisticsModel Calculate(StatisticsRequest model)
{
//no version code here
}
protected override void CalculateInternal(Request r)
{
}
}
public class AggregateCalc : BaseCalculator
{
public AggregateCalc() : base(new Version(ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString)) { }
public override StatisticsModel Calculate(StatisticsRequest model)
{
//no version code here
}
protected override void CalculateInternal(Request r)
{
}
}