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

Я использовал 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>, так как я могу заставить это работать?


person Chris Kolenko    schedule 11.08.2009    source источник
comment
Из любопытства, почему ваш класс Person абстрактный? Я уверен, что причина есть, но я не вижу ее в вашем коде   -  person Adam Cooper    schedule 12.08.2009


Ответы (2)


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

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

person Rob Sutherland    schedule 12.08.2009

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

Чтобы получить: DO -> Factory -> BO

Чтобы сохранить: BO -> Façade / Controller -> DO

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

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

person Matware    schedule 19.08.2009