Импорт данных из стороннего источника данных (дизайн открытой архитектуры) - PullRequest
2 голосов
/ 10 июня 2010

Как бы вы разработали приложение (классы, интерфейсы в библиотеке классов) в .NET, когда у нас есть фиксированный дизайн базы данных на нашей стороне, и нам нужно поддерживать импорт данных из сторонних источников данных, которые, скорее всего, будут вXML?

Например, допустим, в нашей БД есть таблица Products, в которой есть столбцы Идентификатор заголовка Описание TaxLevel Цена

, а с другой стороны, например, Products: ProductId ProdTitle TextBasicPrice Quantity.

В настоящее время я делаю это так: пусть сторонний XML преобразует в классы и XSD, а затем десериализует его содержимое в строго типизированные объекты (в результате этого процесса мы получаем классы, подобные ThirdPartyProduct,ThirdPartyClassification и т. Д.).

Тогда у меня есть такие методы:

InsertProduct(ThirdPartyProduct newproduct)

В настоящее время я не использую интерфейсы, но мне бы хотелось.Я хотел бы реализовать что-то вроде

public class Contoso_ProductSynchronization : ProductSynchronization
{
    public void InsertProduct(ContosoProduct p)
    {
        Product product = new Product(); // this is our Entity class
        // do the assignments from p to product here

        using(SyncEntities db = new SyncEntities())
        {
            // ....
            db.AddToProducts(product);
        }
    }

    // the problem is Product and ContosoProduct have no arhitectural connection right now
    // so I cannot do this
    public void InsertProduct(ContosoProduct p)
    {
        Product product = (Product)p;

        using(SyncEntities db = new SyncEntities())
        {
            // ....
            db.AddToProducts(product);
        }
    }
}

, где ProductSynchronization будет интерфейсом или абстрактным классом.Скорее всего, будет много реализаций ProductSynchronization.Я не могу жестко закодировать типы - классы, такие как ContosoProduct, NorthwindProduct могут быть созданы из сторонних XML (поэтому желательно, чтобы я продолжал использовать десериализацию).

Надеюсь, кто-то поймет, что я пытаюсь объяснить здесь.Просто представьте, что вы продавец, и у вас есть множество провайдеров, и каждый из них использует собственный проприетарный формат XML.Я не против разработки, которая, конечно, будет необходима каждый раз, когда появляется новый формат, потому что для его реализации потребуется всего 10-20 методов, я просто хочу, чтобы архитектура была открытой и поддерживала это.

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

1 Ответ

0 голосов
/ 10 июня 2010

[РЕДАКТИРОВАТЬ: Проектная заметка]

Хорошо, с точки зрения дизайна я бы сделал xslt для входящего xml, чтобы преобразовать его в унифицированный формат. Также очень легко проверить результат xml в направлении схемы.

Используя xslt, я бы держался подальше от любого интерфейса или абстрактного класса, и в моем коде была бы только одна реализация класса, внутренний класс. Это обеспечит чистоту базы кода, а сами xslt должны быть довольно короткими, если данные так просты, как вы заявляете.

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

Если вы решите, что абсолютно хотите иметь один класс на xml (или если вы, возможно, получили dll .net вместо xml от одного клиента), то я бы заставил прокси-класс наследовать интерфейс или абстрактный класс (на основе внутреннего класса, и реализуйте сопоставления для каждого свойства в соответствии с необходимостью в прокси-классах. Таким образом, вы можете привести любой класс к своему базовому / внутреннему классу.

Но мне кажется, что преобразование / отображение в коде сделает дизайн кода немного более запутанным.

[Оригинальный ответ]

Если я вас правильно понимаю, вы хотите сопоставить класс ThirdPartyProduct с вашим собственным внутренним классом.

Изначально я думал о картографировании классов. Используйте что-то вроде Automapper и настройте сопоставления при создании прокси-серверов для десериализации xml. Если ваша десериализация будет иметь те же имена свойств, что и ваш внутренний класс, тогда для маппера будет меньше настроек. Соглашение о конфигурации.

Я бы хотел услышать чьи-либо мысли о том, чтобы идти по этому маршруту.

Другой подход - добавить .ToInternalProduct( ThirdPartyClass ) в класс Converter. И продолжайте добавлять больше по мере добавления внешних классов.

Третий подход - для ребят из XSLT. Если вы любите XSLT, вы можете превратить xml в нечто, что можно десериализовать во внутренний класс продукта.

Какой из этих трех вариантов я бы выбрал, зависит от навыков программиста и от того, кто будет продолжать добавлять новые внешние классы. Подход XSLT не потребует перекомпиляции или компиляции кода по мере появления новых форматов. Это может быть преимуществом.

...