Расширение компонента дополнительными свойствами - PullRequest
3 голосов
/ 13 января 2012

Так что я думаю о создании простого компонента, который я бы использовал в различных проектах. Компонент предоставляет класс (скажем, автомобиль), который я использую во многих проектах. Компонент также имеет такие вещи, как базовые представления для перечисления различных автомобилей и сохраняет свои собственные данные в базе данных через Entity Framework.

Теперь мой вопрос: как мне расширить этот автомобильный компонент между проектами? Большинство автомобилей в разных проектах имеют очень похожие свойства, но у всех есть некоторые дополнительные. Итак, как мне добавить эту дополнительную функциональность (или просто свойства) к компоненту таким образом, чтобы я мог просто обновить .dll, содержащую компонент, если я позже улучшу базовый компонент? И как мне сделать компонент "осведомленным" о дополнительных столбцах в его БД?

Пока что я рассматривал две разные альтернативы, но тоже не люблю. Сначала нужно просто взять последнюю версию компонента, добавить материал, который нужен текущему проекту, и использовать его. Но это, очевидно, становится громоздким, если я хочу обновить базовый компонент. Вторая альтернатива, о которой я подумал, заключается в том, что основной компонент имеет ссылку на таблицу «расширений», которая затем может быть определена далее в проекте настройки. Или что-то в этом роде.

Как вы, вероятно, можете сказать, я совершенно новичок во всем этом. Так что любые советы очень ценятся!

Ответы [ 2 ]

0 голосов
/ 13 января 2012

Если под моделью EF вы подразумеваете файл EDMX, то ответ, скорее всего, не возможен.Вы можете получить новый компонент из существующего в другом проекте / решении, но вы не можете расширить EDMX = вы должны создать новый EDMX для новой модели компонента в каждом проекте, добавив его настройки.EDMX - это отображение, и если вы изменили класс или базу данных, вы должны определить новое отображение, и, поскольку EDMX - это файл XML, его нельзя наследовать так же просто, как вы делали это с классом (на самом деле, существует только один способ повторного использования существующего EDMX, ноон очень ограничен и очень сложен в использовании, потому что он не поддерживается конструктором в Visual Studio).

В случае с кодом сначала вы можете определить EntityTypeConfiguration для базового компонента и наследовать его в новом проекте, чтобы добавитьваши новые свойства.Но опять же, вам понадобится некоторая настройка, потому что ваш построитель модели в новом проекте должен будет загрузить корректный (новый) класс конфигурации сопоставления вместо старого, используемого в исходном проекте.

В случае с первым кодом вы также можетеиспользуйте соглашения по отображению «по умолчанию», которые позволят ему работать без каких-либо изменений в отображении, если вы будете следовать правильным шаблонам именования (свойства и классы в коде должны иметь те же имена, что и столбцы и таблицы в базе данных).

Еще одна дополнительная проблемаэто с ObjectSet / DbSet.Если ваш базовый контекст использует что-то вроде:

public ObjectSet<Car> Cars { get; set; }

и вы хотите, чтобы в вашем новом проекте были только производные классы, вы должны также изменить контекст, иначе вы будете работать с отображенным наследованием, которое только усложнит все.

0 голосов
/ 13 января 2012

Может быть, я что-то не так понял, но вы можете иметь, например:

//Component.DLL
public class Component 
{
   //basic functionality
}

//CarComponentDLL
public class CarComponent : Component 
{
  //extend component for cars 
}

//HorseComponentDLL
public class HorseComponent : Component
{
  //extend component for horses
}

сейчас в разных проектах используются разные расширения, например CarComponent или HorseComponent, например

Component  mycompo = new HorseComponent ();

здесь я использую расширенную для лошадей версию моего компонента. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Я бы знаю, .

Теперь, когда вы собираетесь выпустить новую версию Component, просто дайте им ComponentDLL, учитывая, что сделанные вами изменения были сделаны с учетом концепции обратной совместимости, вы ничего не сломаете, и клиентские проекты продолжат использовать их расширенные версии с вашими исправлениями.

Надеюсь, я ответил на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...