문제

다음으로 구성된 웹 응용 프로그램이 있습니다.

  • 웹 프로젝트 (Connection String이 포함 된 Web.config 파일 포함 - 웹 프로젝트에서는 데이터 액세스 코드가 없음)
  • LINQ -SQL 클래스를 사용하여 웹 프로젝트 UI에 엔터티를 제공하는 데이터 액세스 프로젝트 (이 프로젝트에는 설정 파일과 App.Config가 있습니다. 둘 다 연결 문자열이 있습니다).

빌드하고 배포 할 때 데이터 access .dll이있는 bin 디렉토리에 설정 파일 또는 app.config가 없지만 web.config 파일의 연결 문자열을 변경하지 않으므로 연결 문자열이 필요하지 않으므로 연결 문자열이 필요합니다. 데이터 액세스 DLL에 컴파일하십시오.

필요한 것은 전체 배포 (웹 사이트, 데이터 액세스 DLL)에 대한 하나의 구성 파일입니다. 현재 여러 연결 문자열이 사방에 사용되거나 하드 코딩되는 것으로 보입니다.

이 혼란을 어떻게 가장 잘 해결합니까?

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

나는 문제가 없었습니다 데이터 액세스 계층 (dal) 내에서 연결 문자열을 사용할 수 있습니다. web.config 파일. 보통 나는 단지 dal에서 연결 문자열 섹션을 복사하여 web.config. DBML 디자이너를 사용하여 데이터 컨텍스트를 작성합니다.

이것이 작동하지 않으면 데이터 컨텍스트 생성자에 연결 문자열을 지정할 수 있습니다. 웹 프로젝트에는 연결 문자열을 포함하여 설정을로드하는 정적 클래스가 있으며 DAL 객체 (또는 데이터 컨텍스트, 직접 작성하는 경우)를 만들 때 제작자에게 전달하십시오.

public static class GlobalSettings
{
    private static string dalConnectionString;
    public static string DALConnectionString
    {
       get
       {
           if (dalConnectionString == null)
           {
              dalConnectionString = WebConfigurationManager
                                      .ConnectionStrings["DALConnectionString"]
                                        .ConnectionString;
           }
           return dalConnectionString;
       }
    }
}
...

using (var context = new DALDataContext(GlobalSettings.DALConnectionString))
{
   ...
}

다른 팁

시작 프로젝트의 구성 파일은 포함 된 모든 프로젝트의 구성 설정을 정의합니다. 예를 들어 웹 프로젝트가 시작 프로젝트 인 경우 "AppSettings"에 대한 모든 참조는 Web.config에서 설정을 찾습니다. 여기에는 데이터 액세스 프로젝트의 "AppSettings"에 대한 참조가 포함됩니다. 따라서 Data Access Project의 App.Config의 구성 설정을 웹 프로젝트의 Web.config로 복사하십시오.

레지스트리를 기반으로 자신의 ConnectionFactory를 굴립니다.

  • 소프트웨어에서 응용 프로그램에 대한 레지스트리 키를 추가/[Your_company]/[Your_app
  • ConnectionString에 문자열 값을 추가하십시오
  • ConnectionFactory를 가르치는 데 적절한 레지스트리 키를 열도록 가르치십시오 (모든 페이지로드가 아니라 정적 생성자로).
  • 레지스트리 정보를 .reg 파일로 내보내고 소스 제어에 추가하고 추가 시스템을 설정하는 데 필요한 경우 수정 및 적용하십시오.

찬성:

  • 설정하기 간단합니다
  • ConnectionString은 단일 장소에 살고 있습니다
  • Web/App.config에 있지 않으므로 환경 별 설정을 하드 코드 할 필요가 없습니다.
  • Web/App.config에 있지 않으므로 Junior Dev Jimmy

범죄자:

  • 중요한 것들이 레지스트리에 살고 있다는 것이 명백하지 않으므로 새로운 개발자는 지침이 필요합니다.
  • 새 배포 머신을 구성 할 때 추가 단계
  • 레지스트리는 Oldskool입니다. 주니어 데브가 당신을 조롱 할 것입니다.

응답에 감사드립니다.

앱이 web.config에서 설정을 사용한다고 말하는 사람들은 내 코드에서 참조하는 인스턴스에 맞습니다.

_connectionString = ConfigurationManager.AppSettings["ConnectionString"];

.. 그러나 linq -sql datacontexts에는 다른 문제가 있습니다. 매개 변수가없는 생성자에 사용하기 위해 컴파일 된 DLL에 연결 문자열이 포함된다고 생각합니다. Tvanofosson이 말했듯이 Web.config의 연결 문자열을 참조하여 Datacontexts를 만들어야합니다. 내가 엉킴에 빠진 곳입니다 :)

나는이 문제에 대해서도 약간의 어려움을 겪었다. C# 부분 클래스 정의를 사용하고 DBML Designer가 만든 DataContext를 확장하여 솔루션을 찾았습니다. 이 솔루션은 TVANFOSSON의 답변과 매우 유사합니다. 당신이해야 할 일은 기본 생성자가 설정에서 연결을 가져 오는 부분 데이터 콘텐츠 클래스를 만들고 dbml 디자이너 dc 속성에서 연결을 설정하는 것입니다. 그렇게하면 연결 문자열이 DLL로 컴파일되지 않습니다. DataContext는 web.config ConnectionString 설정에서 연결 문자열을 자동으로 가져옵니다. 이것이 App.Config 와도 작동하는지 테스트하지 않았지만 잘 작동해야한다고 생각합니다.

다음은 부분 DC 클래스의 샘플입니다.

namespace MyApplication {
    /// <summary>
    /// Summary description for MyDataContext
    /// </summary>
    /// 
    public partial class MyDataContext
    {
        public MyDataContext() :
            base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
}

응용 프로그램은 web.config 파일의 구성 항목 만 사용합니다. 구조가 제대로 구조 인 한 web.config 파일에 DLL 구성 설정을 넣을 수 있습니다. 내 예는 내 네임 스페이스를 사용하여 VB 특이 적이지만 일반적인 아이디어를 제공합니다.

구성 파일의 구성 파렛에서는 항목이 필요합니다.

<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="YourAssembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup></configSections>

그런 다음 ApplicationSettings 구성 파일의 일부에서 각 DLL에 대한 항목을 넣습니다.

    <applicationSettings>
      <YourAssembly.My.MySettings>
        <setting name="DebugMode" serializeAs="String">
            <value>False</value>
        </setting>
      </YourAssembly.My.MySettings>
    </applicationSettings>  

자동 생성 된 코드의 무엇이든 안전하게 유지하려면 데이터 컨텍스트의 oncreated () 메소드에서 연결 정보를 무시합니다.

using System.Configuration;
namespace MyApplication 
{
    partial void OnCreated()
    {
        // attempt to use named connection string from the calling config file
        var conn = ConfigurationManager.ConnectionStrings["MyConnectionString"];
        if (conn != null) Connection.ConnectionString = conn.ConnectionString;
    }
}

이런 식으로 DBML 디자이너는 연결 작업을 수행 할 수 있지만 (웹 프로젝트 외부에서는 좋지 않음) 응용 프로그램이 실행될 때 연결을 최종적으로 제어 할 수 있습니다.

여기를 보는 한 가지 방법이 있습니다. 어떤 구성 요소를 사용할 데이터베이스에 대한 결정을 내려야합니까? 데이터베이스 (또는 최소한 연결 문자열)가 향후 변경 될 수 있습니다. 웹 사이트는 사용할 데이터베이스를 결정합니까? 아니면 달이 결정합니까?

DEV, QA, UAT 및 PROD 데이터베이스가있는 경우 이러한 연결 문자열을 관리하는 것이 중요합니다.

웹 사이트가 결정되면 Connection String을 Web.Config에서 DAL으로 전달해야합니다. 웹 사이트가 데이터의 출처를 알거나 관리해서는 안되면 연결 문자열이 DAL에 속합니다.

열거를 매개 변수로 취하고 완전히 형성된 연결 객체를 반환하는 ConnectionFactory 객체를 정의하는 것은 어떻습니까?

데이터 액세스 프로젝트를 사용해야 할 때 웹 응용 프로그램이 연결 문자열을 제공 할 수도 있습니다. 생성자의 일부로 만들 수 있습니다.

또한 데이터 액세스 프로젝트가 호출 할 때 외부 파일에서 연결 문자열을로드하기 위해 고유 한 논리를 작성할 수 있습니다.

완벽한 세상에서는 데이터 계층을 리팩터링하여 System.configuration 또는 관련 생성자/공장을 통해 구성 설정을 선택할 수 있다고 생각합니다. 즉, 암시 적 구성 소스를 다시 사용하거나 호스트/소비자로부터 명시 적으로 연결을 설정해야합니다. 이러한 유형의 상수를 중앙 집중화하기위한 또 다른 관련 패턴은 Readonly 속성을 정적 헬퍼 클래스에 버리고 해당 클래스가 구성 등의 실제 해상도를 관리하는 것입니다.

이를 우아하게 수행하는 방법에 대한 좋은 예는 nhibernate와 그 구성/매핑 관리에 대한 좋은 예를 보여줄 수 있다고 생각할 수있는 한 곳입니다. 물론, 그것은 약간의 XML 지옥이며 유창한 NHIB는 더 단맛이지만 대부분의 실제 샘플은 지원 어셈블리와 실행 어셈블리에서 구성을 조정하는 방법을 보여줍니다.

.config 파일을 기반으로 자신의 ConnectionFactory를 롤하십시오.

  • 맵을지도하려는 사용자 정의 구성 섹션 정의 키/연결 쌍
  • 호스트 이름 또는 machineName을 적절하게 사용하여 해당 구성 섹션으로 스니핑하도록 ConnectionFactory를 가르치십시오.
  • 다양한 dev/qa/prod 서버의 키/연결 값을 채우고 다양한 app.config, web.config 등에 삭제하십시오.

찬성:

  • 프로젝트 내부의 모든 생명은 놀라운 일이 아닙니다
  • 추가 배포 대상 추가는 .config 파일의 복사/붙여 넣기 작업입니다.

범죄자:

  • 특히 12 개의 프로덕션 서버가있는 경우 큰 못생긴 XML 섹션을 만듭니다.
  • 프로젝트간에 복제해야합니다
  • 새로운 대상을 추가하려면 코드 변경 및 재개가 필요합니다
  • 코드는 살아날 환경에 대해 알아야합니다.

나는 이것이 늙었다는 것을 알고 있지만 여기에 내가하는 방법이있다 (나는 @seba의 길을 좋아하지만 그것을 시도하지 않았다).

이는 DBML 파일이 자체 클래스 라이브러리에 상주한다고 가정합니다.이 라이브러리는 여러 웹 사이트 및 기타 클래스 라이브러리에서 엔티티 및 데이터 액세스를 공유 할 때 가장 편리하다고 생각합니다. 또한 각 프로젝트에서 연결 문자열을 동일하게 이름을 지정한다고 가정합니다. 나는 다른 환경에 배포 할 때 이것을 설정하기 위해 Nant를 사용합니다.

나는 이것을 @tvanfosson -kudos에서 그 사람에게 위의 상단 답변을 기반으로한다.

  1. linqdatacontext에서 파생 된 나만의 기본 클래스를 만듭니다.

VB 코드는 다음과 같습니다.

    Imports System.Configuration

Public Class CustomDataContextBase
    Inherits System.Data.Linq.DataContext
    Implements IDisposable

    Private Shared overrideConnectionString As String

    Public Shared ReadOnly Property CustomConnectionString As String
        Get
            If String.IsNullOrEmpty(overrideConnectionString) Then
                overrideConnectionString = ConfigurationManager.ConnectionStrings("MyAppConnectionString").ConnectionString
            End If

            Return overrideConnectionString
        End Get
    End Property

    Public Sub New()
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String)
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

    Public Sub New(ByVal connection As IDbConnection, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

End Class
  1. DBML 파일을 열고 속성에서 위의 클래스 이름을 기본 클래스 속성에 추가하십시오.

문의 데이터 컨텍스트 클래스를 동일한 어셈블리에 배치 한 경우 CustomDataconText (예 : 클래스 이름)을 포함하십시오.

그들이 어셈블리에 다른 경우, 완전한 자격을 갖춘 이름 (예 : myco.myapp.data.customdatacontext)을 사용

  1. 디자이너 재료가 올바르게 작동하는지 확인하려면 클래스 라이브러리의 연결 문자열을 app.config 파일에 복사하십시오. 이것은 IDE와는 별도로 사용되지 않습니다.

그게 다야.

연결 문자열을 동일하게 지정해야합니다

본질적으로 수행하는 일은 데이터 컨텍스트가 DBML 파일의 연결 정보를 무시하도록 강요하는 것입니다. configurationManager 메소드를 사용하면 호출 어셈블리에서 연결 문자열을 선택합니다.

HTH

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