У меня есть 2 производных типа:
1) AggregateCalculator
2) AdditionCalculator
Каждый из перечисленных выше производных типов имеет различные transformation logic for subvariants
, и в основном есть 2 шагаучаствует в этом процессе:
1) Tranform
2) Создать и сохранить версию
Если на шаге 2 возникла ошибка, удалить данные из шагов 2 текущего Left and Right Subvariant
.
Я сохранил общий код в VariantProcessor, чтобы делиться между двумя вышеупомянутыми производными типами, но теперь проблема заключается в том, что, если есть ошибка, то как передать текущий Left and Right subvariant Id to the DeleteStatistics method
.
Если я возьму Left and Right Subvariant as instance field at class level
, то для моего метода ниже он не понадобится:
StatisticsModel Process(List<Subvariants> subvariants);
Метод DeleteStatistics для AdditionCalculator также требует Left и Right SubvariantId для удаления статистики для шага 1.
Код:
public interface IVariantProcessor
{
void Process(Variant model);
StatisticsModel Process(List<Subvariants> subvariants);
}
public class Variant
{
public int VariantId { get; set; }
public int CategoryId { get; set; }
public string Name { get; set; }
public List<Subvariants> Subvariants { get; set; }
}
public class Subvariants
{
public int Id { get; set; }
public string Name { get; set; }
}
public sealed class VariantProcessor
{
private string _myAppConnectionString { get; set; }
private readonly Action _transform;
private readonly Action _deleteStep1Data;
public Variant(string _myAppConnectionString,Action transform, Action deleteStep1Data)
{
_myAppConnectionString = _myAppConnectionString;
_transform = transform;
_deleteStep1Data = deleteStep1Data;
}
public void Process(Variant model)
{
try
{
_transform();
//version creation shared by both the derived types
}
catch (Exception)
{
_deleteStep1Data();//How to pass currently executing left and right subvariants if to this method ?
}
}
}
public class AggregateCalculator : IVariantProcessor
{
private string _myAppConnectionString { get; set; }
public StatisticsModel Process(List<Subvariants> subvariants)
{
//other logic
//_myAppConnectionString is not needed for this code
}
public void Process(Variant model)
{
_myAppConnectionString = ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString;
new VariantProcessor( _myAppConnectionString,
() => Transform(model),
() => DeleteStep1Data(model.VariantId));
}
private void Transform(Variant model)
{
for (int counter = 0; counter < model.Subvariants.Count - 1; counter++)
{
var left = model.Subvariants[counter];
var right = model.Subvariants[counter + 1];
//some sort of transformation process between left and right
}
}
private void DeleteStep1Data(int variantId,int leftSubvariantId,int rightSubvariantId)
{
VariantRepo.DeleteStatistics(variantId,leftSubvariantId,rightSubvariantId);
}
}
Так что есть возможность получить доступ к этим параметрам Id левого и правого подвариантов из делегата действия или есть какой-нибудь другой способ?