Нет, ваши последовательности not равны!
Позволяет удалить бит последовательности и просто взять то, что находится в первом элементе для каждого элемента
var firstExpected = new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
var firstActual = new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
Console.WriteLine(firstExpected == firstActual); // writes "false"
Приведенный выше код сравнивает два отдельных массива для равенства. Равенство не проверяет содержимое массивов, проверяет ссылки на равенство.
Ваш код с использованием SequenceEquals
, по сути, делает то же самое. Он проверяет ссылки в каждом случае каждого элемента в перечислимом.
Я должен был для раздавания объекта соединения, таким образом, я мог позволить нескольким бизнес-объектам сохранять себя к базе данных в единственной транзакции.
, Если бы каждый бизнес-объект должен был создать свой собственный SQLConnection к базе данных, транзакция возросла бы к распределенной транзакции, и я хотел избежать этого.
мне не нравилось иметь необходимость передать объект SQLConnection в качестве параметра для сохранения объекта, таким образом, я создал ConnectionManager, который обрабатывает создание объекта SQLConnection для меня, отслеживание использования объекта SQLConnection и разъединения объекта SQLConnection, если не используемого.
Вот некоторый код как пример ConnectionManager:
public class ConnectionManager: IDisposable
{
private ConnectionManager instance;
[ThreadStatic]
private static object lockObject;
private static Object LockObject
{
get
{
if (lockObject == null)
lockObject = new object();
return lockObject;
}
}
[ThreadStatic]
private static Dictionary<string, ConnectionManager> managers;
private static Dictionary<string, ConnectionManager> Managers
{
get
{
if (managers == null)
managers = new Dictionary<string, ConnectionManager>();
return managers;
}
}
private SqlConnection connection = null;
private int referenceCount;
private string name;
public static ConnectionManager GetManager(string connectionName)
{
lock (LockObject)
{
ConnectionManager mgr;
if (Managers.ContainsKey(connectionName))
{
mgr = Managers[connectionName];
}
else
{
mgr = new ConnectionManager(connectionName);
Managers.Add(connectionName, mgr);
}
mgr.AddRef();
return mgr;
}
}
private ConnectionManager(string connectionName)
{
name = connectionName;
connection = new SqlConnection(GetConnectionString(connectionName));
connection.Open();
}
private string GetConnectionString(string connectionName)
{
string conString = Configuration.ConnectionString;
return conString;
}
public SqlConnection Connection
{
get { return connection; }
}
private void AddRef()
{
referenceCount += 1;
}
private void DeRef()
{
lock (LockObject)
{
referenceCount -= 1;
if (referenceCount == 0)
{
connection.Dispose();
Managers.Remove(name);
}
}
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
DeRef();
}
}
~ConnectionManager()
{
Dispose(false);
}
#endregion
}
Вот то, как я использовал бы его от бизнес-объекта:
public void Save()
{
using (ConnectionManager mrg = ConnectionManager.GetManager("SQLConnectionString")
{
using (SQLCommand cmd = new SQLCommand)
{
cmd.connection = mgr.Connection
// More ADO Code Here
}
_childObject.Save(); //this child object follows the same pattern with a using ConnectionManager.
}
}
я сохраняю бизнес-объект, и все его дети сохраняются также с помощью того же объекта соединения. Когда объем отпадает от исходного родителя, оператор использования закрывает соединение.
Это - шаблон, который я изучил от Rocky Lhotka в его платформе CSLA.
Keith
Вы действительно не должны решать эту проблему сами, поскольку существуют бесчисленные инструменты там, которые могут сделать это для Вас.
, Если Вы действительно хотите сделать это сами, затем изучите Единица работы шаблон, где можно управлять жизненным циклом соединения/транзакции. Вы, конечно, не хотите пытаться переместиться по грязным водам, где существуют соединения, которые быть открылось/закрыло в различных местах.
, Если Вы решаете позволить своим компонентам непосредственно открытые соединения дб тогда, вероятно, что жизненный цикл соединения будет слишком мелкомодульным и приведет ко многим, открываются/закрывают соединения для операции отдельного пользователя.
поставщик SQL Server ADO.NET делает саму организацию пула подключений. Можно управлять размером пула MinPoolSize
и MaxPoolSize
в строке подключения.
В вашем примере следует опасаться того, что приложения ASP.NET не должны использовать хранилище ThreadStatic, так как поток может быть использован повторно, и если вы не очистите все ваши объекты, то в конечном итоге соединение будет зависеть.
В приложении ASP.NET я бы вместо этого использовал коллекцию HttpContext.Items. Вы реализуете IDisposable, но я видел сценарии, в которых разработчики забывают вызвать Dispose или поместить код в use block.
.