DAL, ориентированные на будущее

Мы находимся в начале действительно длительного девелоперского проекта с несколькими подпроектами. Обычно на разработку каждого подпроекта уходит несколько месяцев. Сам код будет разделен на несколько проектов C #, но физическая база данных будет использоваться всеми проектами.

Проблема в ремонтопригодности. Если мы добавим столбец в таблицу или разделим таблицу на две меньшие таблицы, нам придется вернуться и изменить наш C # DAL для поддержки этих изменений. Это неприемлемо, поскольку мы будем постоянно адаптировать БД к потребностям компании в целом, а не только к потребностям отдельной программы. Постоянное изменение старого кода было бы бесконечной задачей.

Наши специалисты по БД предложили иную точку зрения. Мы выполняем все наши CRUD через хранимые процедуры и используем Linq в нескольких таблицах для выполнения наших операторов SELECT. Затем, если мы реструктурируем БД через несколько лет, мы сможем просто предоставить те же хранимые процессы и представления и не будем изменять наш старый код.

У нас возникает вопрос, какой ORM следует использовать для чего-то подобного? EF кажется немного излишним (возможно, это не так). Будет ли что-то вроде SubSonic с его шаблонами T4 допускать упрощенный (и, возможно, более быстрый) DAL?

Или, может быть, у кого-то есть идея, как сделать весь этот процесс менее болезненным? Мы не хотели бы добавлять еще один уровень в наше приложение, но мы также не хотим возвращаться и изменять код каждый раз, когда мы вносим изменения в базу данных.

Редактировать 1: Итак, когда я сказал: «Я действительно не хочу добавлять больше слоев». В основном это потому, что у нас уже есть несколько слоев. У нас есть представления Silverlight, модели представлений, объекты BLL (через CSLA), затем у нас есть DAL и, наконец, их таблицы SQL.


person Timothy Baldridge    schedule 18.01.2011    source источник
comment
Итак, пытаясь использовать одну схему для обслуживания всех, вы в основном придете к модели, которая наименее отстойна. Мне всегда интересно, как люди могут ожидать изменения БД, не касаясь приложений, которые к ней обращаются. Это кажется нереальным.   -  person flq    schedule 19.01.2011
comment
Интеграция через базу данных вышла из моды в конце 70-х годов. Если вы не используете OODB, например Gemstone.   -  person Stephan Eggermont    schedule 19.01.2011
comment
Я единственный, кто думает, что этот вопрос получит много просмотров и ответов, но не действительно полезных?   -  person Conrad Frix    schedule 19.01.2011
comment
@flq - Представьте себе программу расчета заработной платы. Допустим, система расчета заработной платы действительно заботится только о зарплате человека и количестве отработанных часов. Позже мы добавим биллинговую систему, которая выставляет счета клиентам на основе ставки счета сотрудника. Эта ставка счета не имеет ничего общего с начислением заработной платы, так почему я должен возвращаться и редактировать код, которому может быть много лет, просто чтобы добавить поле, необходимое для программы отчетности.   -  person Timothy Baldridge    schedule 19.01.2011
comment
@ Тимоти: так зачем мне возвращаться и редактировать код, которому может быть много лет, просто чтобы добавить поле, необходимое для программы создания отчетов. Позвольте мне настоятельно предложить вам держаться подальше от любого ORM, который ограничен созданием одного класса для каждой таблицы. Сюда входят Linq2Sql и SubSonic.   -  person quentin-starin    schedule 19.01.2011
comment
почему бы вам не создать службу (например, WCF / OData и т. д.), которая также действует как DAL и живет на собственном сервере. Эта служба обращается к базе данных, используя ‹технологию вставки здесь›. затем все проекты взаимодействуют со службой WCF. если база данных изменяется, требуется только служба WCF - контракт службы остается прежним.   -  person RPM1984    schedule 19.01.2011


Ответы (3)


C# DAL... not just the needs of a single program. Вся суть C # DAL как отдельной сборки заключается в том, что ее можно повторно использовать в любом типе приложения .NET. Основная проблема, с которой вы столкнетесь, заключается в том, что при изменении базы данных DAL должен измениться (один раз), а затем все приложения, зависящие от DAL, должны быть повторно развернуты с новым DAL. У вас также есть проблема, заключающаяся в том, что DAL не может использоваться приложениями, отличными от .NET.

Итак, как вы можете централизовать DAL, чтобы вам не приходилось повторно развертывать его для каждого приложения? Подумайте о SOA. Вы можете создать службу WCF, содержащую DAL (и, возможно, BLL). Все ваши приложения (если вы используете веб-службы, даже те, которые не являются .NET) могут использовать эту службу. При изменении базы данных вы обновляете службу WCF и выполняете развертывание один раз. Только убедитесь, что вы не вносите критических изменений! Создайте MyMethod2, если вам нужно добавить / изменить функциональность.

Примечание: когда вы слышите n-tier, это обычно относится к трехуровневому, где каждый уровень представляет собой отдельное программное обеспечение и обычно на отдельных серверах: презентация (UI), приложение (ваш BLL / DAL), данные (ваша база данных SQL). В этой архитектуре есть свои достоинства.

We'd rather not add another layer to our application. Хорошо, поэтому трехуровневый подход может быть не лучшим в вашем случае.

neither do we want to go back and modify code everytime we make a db change Тогда то, что предложили ваши администраторы баз данных, - единственный выход.

Однако учтите следующее: изменение хранимой процедуры - это то же самое, что изменение кода? По сути, это одно и то же. Хранимые процедуры SQL часто не контролируются и не тестируются, но должны. У SQL нет богатства такого языка, как .NET. WCF можно легко масштабировать в веб-ферме. Если учесть эти и другие причины, возможно, стоит перейти на трехуровневый подход / SOA.

Это действительно зависит от размера вашего проекта, навыков персонала, будущего роста и т. Д., И это то, что можете определить только вы.

person Nelson Rothermel    schedule 18.01.2011

Я начал использовать BLToolkit на основе информации о производительности из http://ormeter.net/

Вы можете определить свою модель в простых файлах классов, добавить несколько методов с примененными атрибутами и предварительно получить DAL. Разделите таблицу на две части, и вы сможете сохранить исходный файл класса при создании новых для поддержки разделенных таблиц. Просто убедитесь, что вы создали проект тестирования, который затрагивает все методы, чтобы убедиться, что все они работают с каждым выпуском.

Класс

    public class DirectoryListing
    {
        [PrimaryKey, Identity]
        public Int64 Id { get; set; }
        public Int64? OldId { get; set; }
        public Int32 CategoryId { get; set; }
        [Nullable]
        public String CompanyName { get; set; }
}

Общая функция выбора или табличного значения:

[SqlQuery("SELECT * FROM Ajax_CategorySearch(@SearchString, @ResultCount)")]
[Cache(MaxCacheTime = 10, IsWeak = false)]
public abstract List<String> AjaxCategorySearch(String @SearchString, Int32 @ResultCount = 10);

Или использовать сохраненную процедуру:

[ActionName("SelectById")]
public abstract Model.DirectoryListing SelectById(Int64 @Id);

Это вызовет SP DirectoryListing_SelectById

О, и делать вещи более классическим способом тоже легко

    using (BIFDbManager db = new BIFDbManager())
    {
        var output = db.SetCommand(
            "SQL GOES HERE",
            db.Parameter("@Id", 1))
            .ExecuteList<DAL.Model.DirectoryListing>();

        totalrecords = output.Count();

        return output;
    }

Последний кусок головоломки - это менеджер баз данных, который также включает поддержку LINQ.

public class BIFDbManager : DbManager
{
    public BIFDbManager() : base("Connection string name") { }

    public Table<DirectoryListing> DirectoryListings { get { return GetTable<DirectoryListing>(); } }
}
person Hawxby    schedule 18.01.2011
comment
Итак, вы предлагаете создать свои объекты DAL вручную? - person Timothy Baldridge; 19.01.2011
comment
Ну, я делаю это только для того, чтобы держать под контролем, но тебе не обязательно. bltoolkit.net/Doc.T4Templates.ashx?HL=t4 - person Hawxby; 19.01.2011

Как долго вы можете работать без базы данных? Если это проблема, сообщите об этом позже. И да, это, вероятно, означает, что вы добавляете слой.

person Stephan Eggermont    schedule 18.01.2011