Silverlight / ASP.NET - динамическое указание на базу данных с помощью ADO.NET/Domain Services

Я новичок в Silverlight и следую руководству Silverlight для бизнес-приложений. Я подключил файл MDF, используя модель сущности ADO.NET и службу домена, как показано в видео, и все они работают нормально.

Сложность возникает из-за необходимости динамически указывать на базу данных.

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

Я понял, как изменить строку подключения модели, изменив код, как показано в приведенном ниже коде. Однако я не уверен, что смогу заставить его работать, используя это, или как заставить его работать, используя это, поскольку нет прямой связи между приложением Silverlight и ASP.NET.

string fileName = string.Empty;
void OnContextCreated()
{
    this.Connection.ConnectionString = GenerateConnectionString(".\\SQLEXPRESS", "|DataDirectory|\\" + fileName + ".mdf");
}

public static string GenerateConnectionString(string dbServer, string fileName)
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();

    // Set the properties for the data source.
    sqlBuilder.DataSource = dbServer;
    //sqlBuilder.InitialCatalog = dbName;
    //sqlBuilder.UserID = "YOUR_USERNAME";
    //sqlBuilder.Password = "YOUR_PASSWORD";
    sqlBuilder.IntegratedSecurity = true;
    sqlBuilder.AttachDBFilename = fileName;
    sqlBuilder.UserInstance = true;
    sqlBuilder.MultipleActiveResultSets = true;
    sqlBuilder.ApplicationName = "EntityFramework";

    // Build the SqlConnection connection string.
    string providerString = sqlBuilder.ToString();

    // Initialize the EntityConnectionStringBuilder.
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

    //Set the provider name.
    entityBuilder.Provider = "System.Data.SqlClient";

    // Set the provider-specific connection string.
    entityBuilder.ProviderConnectionString = providerString;

    // Set the Metadata location.
    entityBuilder.Metadata = @"res://*/Model.csdl|
                   res://*/Model.ssdl|
                   res://*/Model.msl";

    return entityBuilder.ToString();
}

Если это вообще возможно, я хотел бы придерживаться методов, показанных в видео, используя доменные службы и модели сущностей ADO.NET, потому что я получаю доступ к функциям служб RIA, которые позволяют мне перетаскивать таблицы, вносить изменения и т. Д. .. с большой легкостью.

Как я могу указать на базу данных во время выполнения, продолжая использовать методы, показанные в видео?

Изменить

Все базы данных SQL, на которые я буду указывать, имеют идентичный макет. То есть у них одинаковые таблицы и поля. В эти поля вводятся данные, специфичные для пользователя.


person Dragonseer    schedule 09.01.2012    source источник


Ответы (1)


Чтобы сделать это успешно, вам нужен отдельный уровень данных.

Если вы используете MVVM, в любом случае в коде представления за файлами не должно быть кода доступа к данным.

В любом случае я предлагаю вам добавить в решение новый проект библиотеки, который будет реализовывать ваш код уровня данных. Эта библиотека сделает общедоступными только те методы, которые необходимы для получения ваших данных, и они должны быть определены в общедоступном типе интерфейса. Вся ваша бизнес-логика будет относиться к этому интерфейсу или классу, который его реализует. Остальной код уровня данных следует объявить как внутренний, если они должны быть общедоступными в проекте.

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

Если вам нужно использовать разные типы баз данных, например SQL или Oracle, на лету вы можете использовать фабричный шаблон для создания экземпляра класса, реализующего интерфейс, но специфичного для этого типа базы данных.

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

Шаблон MVVM обычно используется по умолчанию для приложений Silverlight / WPF, но вы, как правило, обнаружите, что в большинстве обучающих примеров используется шаблон по умолчанию, в соответствии с которым бизнес-логика находится в коде файлов. Это нормально, пока вы не начнете пытаться внести большие изменения либо в свой код доступа к данным, либо в бизнес-логику, когда вы обнаружите, что меняете намного больше кода, чем нужно.

изменить

Вот несколько ссылок с подробным описанием MVVM и Silverlight.

http://msdn.microsoft.com/en-us/magazine/dd458800.aspx

http://www.silverlight.net/learn/advanced-techniques/the-mvvm-pattern/using-the-mvvm-pattern-in-silverlight-applications

http://www.codeproject.com/KB/silverlight/MVVMSilverlight.aspx

Вот несколько ссылок, подробно описывающих шаблон репозитория для уровня данных:

http://msdn.microsoft.com/en-us/library/ff649690.aspx

http://www.devx.com/dotnet/Article/33695/0/page/5

http://www.codeproject.com/KB/architecture/linqrepository.aspx

person ChrisBD    schedule 09.01.2012
comment
Привет, ChrisBD. Спасибо за ответ. Как я уже упоминал, я новичок в Silverlight и веб-программировании в целом. Я гораздо лучше владею настольными приложениями, такими как консольные приложения и XNA. Я не понял многого из того, что вы сказали. Не могли бы вы рассказать, как я могу реализовать шаблон MVVM? Если бы вы могли связать меня с образцом, который достигает моих целей, или указать мне на ресурс, на котором я мог бы учиться, это было бы здорово. Спасибо! - person Dragonseer; 10.01.2012
comment
Добавлены ссылки для вас, которые могут быть полезны. - person ChrisBD; 10.01.2012