문제

인라인 SQL 통화와 복사/붙여 넣기를 많이 사용하여 거의 독점적으로 작성된 ASP.NET 2.0 웹 응용 프로그램에 대한 데이터 액세스 계층을 추가하는 과정에 있습니다. 비즈니스 문제로 인해 한 번에 적용의 작은 부분 만 재수 할 수 있습니다 (정착 할 수없고 큰 재 설계를 할 수 없음). 큰 변화를 만들고 제대로 테스트합니다.

Enterprise Library Data Access Application Block을 향후 데이터 액세스 계층의 배관으로 사용하기로 결정했으며 이전 설계 결정 중 하나가 문제를 일으키고 있습니다. 현재 사용자가 제공 한 계정 ID를 기반으로 관리자 데이터베이스에서 응용 프로그램에 대한 "기본"연결 문자열을 얻으므로 응용 프로그램의 단일 설치가 여러 데이터베이스에 액세스 할 수 있도록 할 수 있습니다. 내 문제는 해당 연결 문자열 (또는 계정 ID)을 DAL에 가져 오는 모범 사례 방법을 파악하려고 시도합니다.

이전 구현은 암호화 된 연결 문자열을 쿠키에 저장하는 것이 었으므로 현재 해킹 접근 방식은 연결 문자열을 가져온 다음 다음과 같은 방식으로 DAAB를 사용하는 것입니다.

Public Shared Function GetResultsByKeywords(ByVal key1 As String, ByVal key2 As String, ByVal key3 As String, ByVal key4 As String) As DataTable
    Dim db As SqlDatabase = New SqlDatabase(Connection.GetConnectString())
    Dim dt As DataTable = New DataTable

    Using dr As IDataReader = db.ExecuteReader("sel_eHELP_ITEMS", key1, key2, key3, key4)
        dt.Load(dr)
    End Using

    Return dt
End Function

Connection.getConnectString ()이 쿠키에서 연결 문자열을 가져 오는 곳.

나는 이것이 이것을하는 가장 좋은 방법에 가까운 곳이 없다는 것을 알고 있으며 그것을 고칠 필요가 있지만, 나는 그것을 끝내기위한 "올바른"방법으로 고군분투하고 있습니다. 어쩌면 연결 문자열로 초기화하고 다른 모든 클래스를 상속받을 수있는 기본 클래스를 만들 수도 있지만, 이것이 어떻게 보일지, 어디에서 해당 클래스의 인스턴스를 초기화 할 것인지 잘 모르겠습니다. DAL 기능에 액세스하기 전에 모든 페이지에서?

모든 지침에 감사드립니다. 고맙습니다.

업데이트

명확히하겠습니다. 최대 설치를위한 3 ~ 4 개의 다른 연결 문자열이 있습니다. "계정 ID"는 사용자 ID가 아니며 여러 사용자가 연결할 데이터베이스를 본질적으로 지정하는 데 사용됩니다.

도움이 되었습니까?

해결책

편집하다:

최신 업데이트를 사용하면 여전히 DAAB를 사용하여 구성을 조사하는 것이 좋습니다.http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx

ENT LIB 문서를 찾거나 열는 데 어려움을 겪고 있지만 SQLConnection 객체의 변경된 ATABASE 메소드와 동등한지를 볼 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

다음과 같은 방법은 다음과 같습니다. DAL이 귀하의 전환 DB 요구 사항에 대해 알아야한다고 생각하지 않기 때문에 ConnectionString을 생성자의 매개 변수로 설정합니다. 래퍼 방법/속성을 사용하여 해당 요구 사항을 숨기거나 캡슐화하고 앱에서 사용하려는 DAL 인스턴스를 얻으십시오.

(C#을 실례 해주세요)

public class MyDAL
{
    private string _connectionString;

    public MyDAL(string connectionString)
    {
        _connectionString = connectionString;
    }

    public int MyDatabaseCall()
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("my sql", conn))
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    //...data access
                    return 0;
                }
            }
        }
    }
}

public class MyApp
{
    public static Dictionary<string, MyDAL> myDatabases = new Dictionary<string, MyDAL>();

    public string GetConnectionString(string database)
    {
        return System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
    }

    public void StartUp() // Global.asax Application_Start ?
    {
        myDatabases.Add("Database1", new MyDAL(GetConnectionString("Database1")));
        myDatabases.Add("Database2", new MyDAL(GetConnectionString("Database2")));
        myDatabases.Add("Database3", new MyDAL(GetConnectionString("Database3")));
    }

    public MyDAL DataAcccessLayer
    {
        get
        {
            string usersDB = FigureOutUsersDatabase();
            return myDatabases[usersDB];
        }
    }

    public void UseSomeData()
    {
        var myData = DataAcccessLayer.MyDatabaseCall();
        //Do Stuff
    }
}

도움이되기를 바랍니다. 행운을 빕니다! 그리고 BE 매우 조심합니다 쿠키에 넣은 것. ;)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top