Шаблон "фабрика" базы данных с несколькими базами данных

Я нахожу существующие объяснения слишком глупыми. Вот мое объяснение на простом английском языке:

STA: Если поток создает COM-объект, для которого установлено STA (при вызове CoCreateXXX вы можете передать флаг, который устанавливает COM-объект в режим STA), тогда только этот поток может Получив доступ к этому COM-объекту (это то, что означает STA - Single Threaded Apartment), другой поток, пытающийся вызвать методы этого COM-объекта, скрытно превращается в доставку сообщений потоку, который создает (владеет) COM-объект. Это очень похоже на тот факт, что только поток, создавший элемент управления пользовательского интерфейса, может получить к нему прямой доступ. И этот механизм предназначен для предотвращения сложных операций блокировки / разблокировки.

MTA: если поток создает COM-объект, для которого установлено MTA, то почти каждый поток может напрямую вызывать методы для него.

Это в значительной степени суть этого. Хотя технически есть некоторые детали, которые я не упомянул, например, в параграфе «STA», потоком-создателем должен быть сам STA. Но это почти все, что вам нужно знать, чтобы понять STA / MTA / NA.

6
задан 27 June 2009 в 19:54
поделиться

1 ответ

Я бы посоветовал вам взглянуть на шаблон репозитория. Используя шаблон репозитория, вы можете абстрагировать свое приложение от инфраструктуры. Это позволит вам взаимодействовать с одной или несколькими базами данных, веб-службами, файловой системой или любым другим источником данных, который находится за пределами вашего домена и прямого контроля приложений. Благодаря этому у вас может быть инфраструктура, которая негласно может взаимодействовать с несколькими источниками данных. Примером этого было приложение электронной коммерции, над которым я недавно работал, которое позволило мне общаться с моей локальной базой данных для прямого каталога продуктов, а также поговорить с SAP за кулисами для регистрации новых заказов / покупок.

С этим вы могли бы иметь код, который вызывает репозиторий, который выглядит примерно так:

AccountRepository _repository = new AccountRepository();
Account account = _repository.GetAccountByID(32);

Или вы можете сказать что-то вроде:

Account account = new AccountRepository().GetAccountByID(32);

Основная идея репозитория заключается в том, что ваше приложение может выполнять в него вызовы для получения необходимых данных. Он вернет фактические объекты домена (например, Account в приведенном выше примере). Или он может вернуть IEnumerable , если нужен список учетных записей.

Реализация этого метода, в которой вы получаете данные из двух источников данных, может выглядеть так (хотя я не предлагаю смешанных проблем вот так):

public class AccountRepository
{
    public Account GetAccountByID(int accountID)
    {
        Account result = null;

        using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB1))
        {
            result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault();
        }

        //result is null...go to the other database to get an Account
        if(result == null)
        {
            using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB2))
            {
                result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault();
            }
        }

        return result;
    }
}

Я предпочитаю в такой ситуации создать уровень службы приложения, который обрабатывает логику приложения. Репозиторий технически должен быть связан с одним источником данных. Затем у вас может быть несколько разных репозиториев для пары разных источников данных. Затем на вашем прикладном уровне будет создан новый экземпляр GetAccountByID из репозитория 1 (база данных 1), и если он будет нулевым ... прикладной уровень затем погрузится во второй репозиторий (например, база данных 2). По возможности, репозиторий должен соответствовать принципам SOLID. Мой пример явно нарушает подход SOLID по нескольким причинам, по которым реализация GetAccountByID может измениться!

Но ... если это то, что вам нужно ... есть способ сделать это!

3
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: