나는 수백 개의 클라이언트가 호출하는 WCF 서비스를 디자인하고 있으며 데이터베이스 쿼리에 의해 실행될 클래스에 대한 최상의 아키텍처에 대한 질문이 있습니다. 오늘은 SQL Server에만 액세스하므로 내부적으로 호출하는 정적 클래스가있어서 연결 및 데이터 레이아웃을 만드는 모든 더러운 작업을 수행합니다. 다음은 간단한 예입니다.데이터베이스 도우미 클래스에 대한 C# 디자인 패턴
namespace DBHelper.Utility
{
public static class SqlDBManager
{
public static void RunSql(String pSql, DBParamsHelper pDBParams, String pConnStringConfigName)
{
String sConnectionString = GetConnectionStringFromConfig(pConnStringConfigName);
SqlConnection oConn = new SqlConnectionsConnectionString
oConn.Open();
try
{
SqlCommand oCommand = new SqlCommand(pSql, oConn);
oCommand.CommandTimeout = 0;
if (pDBManagerParams != null)
{
foreach (SqlParameter sqlParam in pDBManagerParams)
{
oCommand.Parameters.Add(sqlParam);
}
}
oCommand.ExecuteNonQuery();
}
finally
{
oConn.Close();
}
}
}
}
이제 SQL Server와 Oracle을 모두 실행하기위한 지원을 추가해야합니다. 나의 초기 아이디어는 인터페이스를 선언하고 내 기존의 SqlDBManager
을 구현 한 다음 동일한 인터페이스를 구현하는 OracleDBManager
을 개발하는 것이 었습니다. 문제는 내 클래스가 정적이며 정적 클래스가 인터페이스를 구현할 수 없다는 것입니다. 헬퍼 클래스를 정적으로 유지하고 싶습니다. 훨씬 실용적이어서 쿼리를 실행할 때마다 새 개체를 만들 필요가 없습니다. 나 또한 클래스 상속을 사용하는 방법을 생각했지만 statis 가상 메서드를 사용할 수는 없으므로 많이 사용하지 않습니다. 나는 싱글 톤 구현을 고려하여 클래스를 생성 할 필요가 없지만 멀티 스레드 액세스에 문제가 발생했습니다.
최상의 디자인 패턴이 될 수 있도록 여러 스레드 시나리오 (매우 중요)에서 성능이 뛰어나고 생산성을 위해 너무 많이 코딩하지 않고 (많은 클래스를 만들 필요가 없음) 두 가지 표준 방법을 모두 사용할 수 있습니다. OracleDBManager
및 SqlDBManager
클래스? 표준 메서드는 매우 중요합니다. 왜냐하면이 도우미 클래스를 사용하는 코드가 Oracle 또는 SQL Server에 연결되어 있는지 여부를 알기를 원하지 않기 때문입니다.
Entity Framework 4 및 nHibernate와 같은 ORM 솔루션 사용을 고려해 보았지만 성능에 미치는 영향은 너무 컸습니다. 간단한 쿼리를 실행하기 때문에 PL-SQL과 TSQL 간의 쿼리 구문 차이는 중요하지 않습니다.
모든 의견과 아이디어는 높이 평가됩니다. Tks
그랜트, 당신을위한 제안. 공장 클래스와 열거 자 (enumerators)와 함께 제가 생각한 바로 그 것입니다. 그냥 개체 생성을 피하기 위해,하지만 정말 확실하지 않은 방법이 있다면 ... Tks! – Pascal
개체 생성을 피할 수있는 유일한 방법은 단일 정적 클래스를 사용하고 DB 개체를 만들 때마다 DB 형식의 스위치를 사용하는 것입니다. 앞서 언급 한 프로젝트에서이 작업을 처음 수행했습니다. 너무 번거 롭습니다! 그런 다음 데이터 액세스를 방금 제시 한 내용으로 변경했습니다. 훨씬 간단하고, 실제로, 그리고 다른 데이터 공급자를위한 전문 수업을 용이하게합니다. –