Я нашел решение. Для тех, кто заинтересован, вот оно:
Это похоже на взлом, но это единственное решение, которое я могу придумать. Спасибо Салли Сю на форумах.silverlight.net за идеи.
Поскольку каждый из моих пользователей может иметь несколько баз данных на нескольких серверах, мне нужно было найти способ создания ConnectionString до того, как DomainService использовался впервые. Каждый раз, когда пользователь выбирает новый проект в пользовательском интерфейсе, я устанавливаю файл cookie следующим образом:
private void SetCookie(string cookieName, string cookieValue)
{
DateTime expireDate = DateTime.Now + TimeSpan.FromDays(1);
string newCookie = cookieName + "=" + cookieValue + ";expires=" + expireDate.ToString("R");
HtmlPage.Document.SetProperty("cookie", newCookie);
}
CookieName - SelectedProjectId
, а cookieValue - текущий выбранный проект в моем пользовательском интерфейсе.
Затем я создаю новый DomainService как обычно, но я переопределяю CreateObjectContext()
. Этот метод вызывается при первой ссылке на ваш объект DomainService. Моя переопределение выглядит так:
protected override ProjectEntities CreateObjectContext()
{
long projectId = -1;
StringBuilder connection;
if (System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"] != null)
{
projectId = Convert.ToInt64(System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"].Value);
}
else throw new Exception("Selected Project ID Exception"); // temporary
// Verify this user has access to the DB just in case it's spoofed
// Lookup project ID in my database to get the database name and server name
// Load template connection string found in web.config
// Replace the template holders for SERVER_NAME and DATABASE_NAME with above lookup values
return new ProjectEntities(MyDynamicConnectionString);
}
Опять же, это немного хакерски, но это был единственный способ, которым я мог найти, чтобы динамически создать строку подключения для моих нужд. Я надеюсь, что это помогает кому-то еще ...