Къде да поставите използване (SqlConnection)

Създавам рамка за добавяне на добавки към мое приложение. Всеки плъгин трябва да имплементира абстрактн клас. След това всеки плъгин се компилира като DLL, който основното приложение може да намери с Directory.GetFiles(myPath, "*.dll")

Всичко това работи гладко и мога да инстанцирам плъгините си в основното приложение и да ги използвам. Всеки плъгин е основно приспособление за табло за управление, което потребителят може да добави към своето табло за управление, за да му покаже някои графики или диаграми. Това означава, че всеки плъгин има таймер и при всяко събитие на таймера обновява графиката с данни от SQL базата данни на приложението.

Въпросът ми е къде да сложа SqlConnection? Създавам ли един SqlConnection и го предавам като параметър на всеки плъгин или да предавам низа за свързване и всеки плъгин да създава свой собствен SqlConnection?

Ако предам SqlConnection на приложението към приставката, предполагам, че това ще включва известно управление на връзката вътре в приставката. Очевидно ще трябва да проверя дали е отворено и какво да правя, ако състоянието му е ConnectionState.Fetching или ConnectionState.Executing? Просто изглежда тромаво.

Но от друга страна, като се има предвид, че множество потребители ще изпълняват приложението и всеки потребител може да има няколко избрани приставки в таблото си за управление, това може да доведе до брой SqlConnections. Това желателно ли е? Трябва ли да обмисля трета опция, при която приставката дава своята заявка на хоста, който я поставя на опашка с други заявки от други приставки и връща набора от резултати на приставката, след като заявката е изпълнена? По този начин поне има само едно SqlConnection за всеки потребител, независимо колко добавки са избрали.

Честно казано, последната опция ми се струва доста сложна и все още не съм съвсем сигурен как бих я приложил. Ако някой може да ме насочи към статия, която обяснява нещо подобно, ще съм много благодарен.


person Dewald Swanepoel    schedule 25.04.2015    source източник


Отговори (2)


Лично аз бих препоръчал да предадете фабрика за свързване на вашите добавки и да ги оставите да създават и използват връзките, както намерят за добре. Това означава, че вашето приложение контролира низа за свързване (въпреки че те потенциално биха могли да го прочетат от връзката, освен ако не абстрахирате и това), но те са свободни да създават и използват връзки, ако е необходимо. Както беше посочено в предишен отговор, ако им дадете само една връзка, има много работа за справяне с проблемите с многонишковостта и проблемите със споделянето, които сами споменахте.

Можете да направите нещо толкова просто като:

public interface ISqlConnectionFactory
{
   SqlConnection GenerateConnection();
}

public class SqlConnectionFactory : ISqlConnectionFactory
{
   private readonly string _connectionString;

   public SqlConnectionFactory()
   {
      _connectionString = "your connection string here";
   }

   public SqlConnection GenerateConnection()
   {
       return new SqlConnection(_connectionString);
   }
}

След това плъгинът е отговорен за управлението на връзката (например отваряне, затваряне, изхвърляне). Има много повече неща, които можете да направите с това, за да поемете различни нива на контрол върху връзката, да се опитате да откриете неправилно работещи добавки и т.н.

РЕДАКТИРАНЕ

Абсолютно вашите добавки трябва да използват оператора using():

public void MyPluginMain(ISqlConnectionFactory factory)
{
   using(var connection = factory.GenerateConnection())
   {
      // Do the work
   }
}

Имайки предвид, че приложението ви прехвърля отговорността за поддържане на тези връзки към приставките, приставката трябва да изчисти връзката, когато приключи с нея, независимо дали това е чрез оператора using() или действително извикване на Dispose() след направи това, което направи. Ако това е някакъв вид „публичен“ API, това трябва да е част от вашата документация.

person CodingGorilla    schedule 25.04.2015
comment
Благодаря, това наистина звучи като по-лесния подход. Не съм запознат с фабриката за свързване. Сега го търся в гугъл, но ако имате статия или нещо удобно, към което можете да ме насочите, ще е страхотно. - person Dewald Swanepoel; 25.04.2015
comment
Готини банани. Току що видях актуализацията. Изглежда много елегантно. Мисля, че това е маршрутът, който ще следвам. Не си представям, че приставката ще може да използва (SqlConnection) в този случай? - person Dewald Swanepoel; 25.04.2015
comment
Фабриката за свързване може също така да накара методът GenerateConnection() да избутва всяка връзка към списък и при изхвърляне на приставката да проверява дали всяка връзка в списъка също е изхвърлена. - person Joel Coehoorn; 26.04.2015

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

Вижте SqlConnection и многопоточност

person Michael Sander    schedule 25.04.2015