Wybrałem ServiceStack OrmLite dla mojego projektu, który jest czystą aplikacją zorientowaną na dane. Jestem skłonny pozwolić użytkownikowi końcowemu stworzyć własne typy obiektów zdefiniowane w formacie XML, które będą używane do generowania klas w czasie wykonywania przy użyciu CodeDOM.Dodaj właściwość do klasy POCO w czasie wykonywania
Będę również definiował niektóre obiekty "systemowe" wymagane przez aplikację (tj. User
), ale nie mogę przewidzieć wszystkich właściwości, których użyje końcowy użytkownik, dlatego szukam sposobu na umożliwienie rozszerzenia klas, które utworzę w czas projektowania. Próbka poniżej użytkownik
public class User
{
public Guid Uid { get; set; }
public String Username { get; set; }
public String Password { get; set; }
}
Koniec chce mieć Email
oraz Address
. Powinien móc dodać 2 właściwości do klasy wyższej i całej klasy będą (które nadal mogą być wykorzystywane przez OrmLite, ponieważ pozwala na nadpisanie:
public class User
{
public Guid Uid { get; set; }
public String Username { get; set; }
public String Password { get; set; }
public String Email{ get; set; }
public String Address { get; set; }
}
wiem, że może istnieć ryzyko robi tak aby zawiesić system (jeśli klasa jest już utworzona), więc szukam najlepszego sposobu na uniknięcie tego problemu i naśladuję potrzebuję.
To jest bardzo zbliżone do rozwiązania, które wymyśliłem. Stworzyłem klasy "Property" i "DataObjectType" o relacji N <->. Następnie użyłem generatora kodu CodeDOM do zbudowania nowego 'ExtensionAssembly', który utworzy nowe klasy przy użyciu właściwości rozszerzeń z powyższych tabel. Do każdego z oryginalnych typów użyłem klucza ExtensionKey jako guid, który jest używany przez odpowiednie nowe typy jako identyfikator. –
Ucieczka od konfliktu nazw jest tak łatwa jak dodanie przedrostka lub przyrostka do nowo utworzonych typów, np. "Użytkownik" i "Rozszerzenie użytkownika" –