Например, у меня есть два классаКак избежать вложенных коммутационных конструкций?
public class A
{
public Guid Id { get; set;}
public string Type { get; set; }
public string State { get; set; }
public string SomeProperty { get; set; }
}
public class B
{
public Guid Id { get; set; }
public string Type { get; set; }
public string State { get; set; }
public string AnotherProperty { get; set; }
}
Каждый класс имеет свой собственный репозиторий
public class RepA
{
public void Add(A entity)
{
// some specific logic here
}
public void Delete(A entity)
{
// some specific logic here
}
}
public class RepB
{
public void Add(B entity)
{
// some specific logic here
}
public void Delete(B entity)
{
// some specific logic here
}
}
Мне нужно реализовать метод для сохранения списка объектов с динамическими типами. Я хочу избежать использования вложенных «коммутационных» конструкций (как указано ниже), так как у меня есть более двух типов и более двух состояний, и код становится беспорядочным.
private readonly RepA _repA = new RepA();
private readonly RepB _repB = new RepB();
public void SaveChanges(List<dynamic> entities)
{
foreach (var entity in entities)
{
switch (entity.Type)
{
case "A":
var a = entity as A;
switch (entity.State)
{
case "Added":
_repA.Add(a);
break;
case "Deleted":
_repA.Delete(a);
break;
}
break;
case "B":
var b = entity as B;
switch (entity.State)
{
case "Added":
_repB.Add(b);
break;
case "Deleted":
_repB.Delete(b);
break;
}
break;
}
}
}
Не могли бы вы предложить любые другие решения? Я думал о интерфейсах для базового класса и базового репозитория. Но в этом случае, когда и как я должен инициализировать _repo, который зависит от типа объекта?
private IBaseRep _repo;
public void SaveChanges(List<dynamic> entities)
{
foreach (var entity in entities)
{
switch (entity.State)
{
case "Added":
_repo.Add(entity)
break;
case "Deleted":
_repo.Delete(entity)
break;
}
}
}
Is 'case" Deleted ": _repB.Add (b);' ошибка? Вы имели в виду '_repB.Delete (b);'? –
Прежде всего, почему это должно быть «Список'? Существуют и другие варианты, такие как интерфейс и абстрактные классы. –
Это зависит от того, что A и B находятся в контексте домена? Связаны ли они или могут участвовать в наследовании? Я думаю, да, глядя на их членов. Пожалуйста подтвердите. – niksofteng