SimpleRepository и абстракция - PullRequest
       14

SimpleRepository и абстракция

0 голосов
/ 11 августа 2009

Я использую Sub Sonic 3.x.x.x, и я наткнулся на то, с чем мне нужна помощь. Я использую абстрактный класс, фабричный шаблон и т. Д. и это в основном проблема:

public abstract class Person
{
}

public class Male : Person
{
}

public class Female : Person
{
}

....

Как мне заставить это работать?

String personType = "male";
Type myType = GetPersonTypeFromFactory(personType);

SimpleRepository rep = new SimpleRepository();

var all = rep.All<...>().ToList();

Я не могу поставить rep.All<myType>, так как я могу заставить это работать?

Ответы [ 2 ]

0 голосов
/ 19 августа 2009

Стоит помнить, что десериализация абстрактных объектов - это всегда боль в заднице, так как абстрактные классы не имеют конструктора по умолчанию; Сказав это, ничто не мешает вам десериализовать конкретный класс и вернуть и интерфейс / абстрактный класс с вашей фабрики.
Когда вы сохраняете / извлекаете данные в БД, вы просто делаете это через конкретный объект DO и создаете экземпляр объекта BO на фабрике с помощью конструктора копирования, и он реализует тот же интерфейс, что и объект DO. Но, как и в случае с шаблонами, вам нужно спросить, что вы получаете за код.

Для извлечения: DO -> Factory -> BO

Для хранения: BO -> Фасад / Контроллер -> DO

DO и BO реализуют интерфейс IYourObject или наследуются от YourObjectBase, у которого есть конструктор копирования YourObjectBase (YourObjectBase src).

Много строк кода, если у вас нет нескольких типов BO: -)

0 голосов
/ 12 августа 2009

SimpleRepository не может сохранять объект, который является абстрактным. Я не могу говорить с ActiveRecord однако.

Я уверен, что вы это знаете, но если вы использовали SimpleRepository и хотите получить все одного типа, вы могли бы rep.All<Male>(). Это исключает вашу фабрику, и я уверен, что пример упрощен по сравнению с тем, что вы делаете в реальном мире, так что это, вероятно, не то, что вы хотите.

...