2016-09-01 23 views
5

.NET 구성 설정 기능은 내가 원하는 것만 큼 융통성이 없습니다. Application Settings을 올바르게 이해하는 경우 설정을 변경/수정할 수있는 시점이 제한됩니다. C#에서는 응용 프로그램 설정이 두 가지 유형 또는 범위 ("응용 프로그램"및 "사용자")로 나뉘지만 둘 다 변경 또는 수정 방법에 대한 제한이 있습니다.C# 응용 프로그램 설정 편집/수정

 
    SCOPE: | EDIT AT DESIGN-TIME: |  EDIT AT RUN-TIME:  | EDIT BETWEEN SESSIONS: 
--------------------------------------------------------------------------------------- 
    User  | Setings.settings | Settings.Default.Save() |  *Not supported*  
Application | Setings.settings |  *Not supported*  | edit app.exe.config 

나를 세 가지 메커니즘에 의해 설정을 편집 할 수있는 "기본"설정 기능이 있습니까 : 다음 표는 differnce를 보여줍니다? 구성 파일을 사용하는 주된 동기 중 하나는 사용자가 소스 코드를 다시 빌드하지 않고도 기본값을 변경할 수 있도록 허용하는 것입니다 (응용 프로그램 범위 설정과 함께 수행 할 수 있음). 그러나 사용자는 .config 파일을 편집해서는 안됩니다. 또한 실행 시간에 설정간에 지속되는 변경을 수행 할 수 있어야합니다 (사용자 범위 설정으로 수행 할 수 있음). 확실히 두 가지 기능을 모두 제공하는 메커니즘이 있어야합니다.

최하위 라인 : 왜 응용 프로그램 설정 (app.exe.config)을 런타임에 편집 할 수 없습니까? 그것은 내 모든 문제를 해결할 것입니다. 동일한 컴퓨터를 공유하는 사용자에게 문제가 발생할 수 있음을 이해합니다. 그러나 누가 더 이상 그것을합니까?

잠재적 해결 방법 :숨겨 폴더에 사용자 설정 설정 파일의 기본 저장 위치를 ​​변경하려면 어쨌든 있나요? (해명)


UPDATE : 무슨 말인지 것은 내가 런타임에서 디자인 타임에서 기본 설정을 변경할 수 있도록하려는 것입니다, 또는사이의 세션 (즉, 구성 파일 편집). 그러나 Settings.settings에서 제공하는 기본 제공 C# 지속성 메커니즘을 사용할 때는 3 개 중 2 개를 선택해야합니다. 3 개가 누락 되었습니까? 내가 알지 못하는 다른 대안이 있습니까?

[사용 사례 : 내가 연결 문자열에 대한 "기본"데이터베이스 이름을 저장할하지만 사용자가 (런타임에 다른 데이터베이스를 지정할 수 있습니다함으로써 "새"를되고 싶다 해당 사용자의 기본값). 그렇지만, 나 또한 다시 실행하거나 응용 프로그램을 재 구축하지 않고 설정 파일의 기본을 오버하면 쓸 수 있으려면]

[를보다 효율적으로 사용 케이스 :. (의견에 대 한 응답에서)

모델의 매개 변수에 대한 기본값을 포함하는 구성 파일이있는 계산 모델이 있습니다. 사용자 A는 모델을 시작하고 여러 매개 변수의 값을 변경하기로 결정합니다. 이 변경 사항은 해당 사용자의 이고 모든 사용자 세션은 (즉, RTunTime에서 편집)입니다. 그 사용자는 수정 된 구성 파일을 팀과 공유하려고합니다 (예 : 버전 관리 리포지토리 또는 전자 메일을 통해). 이렇게하면 사용자 B가 애플리케이션 (즉, 세션 간 편집)에서 수동으로 변경하지 않고도 사용자 A의 기본 매개 변수 값을 업데이트 할 수 있습니다. 이러한 모든 개조 작업은 디자인 타임 이후에 수행해야합니다.]

* 내가 실현이 내가 할 수있는 "기술적으로"편집 사용자 범위의 숨겨진의 AppData 폴더에있는 app.exe.config 파일의 설정, 그러나 이것은 숨겨진 파일이며, 모든 사용자가 충분한 권한을 가질 수있다 그것을 볼 수 있습니다. (위의 "잠재적 해결 방법"참조)

+0

지식이 부족함에 따라 이러한 상황을 극복하지 못했습니다. 그러나 app.config를 사용하면 이름 값 쌍에 대한 설정을 정의 할 수 있으므로 그에 따라 런타임에 이름을 선택할 수 있습니다. –

+1

'C#'에 대해 알게 된 직후 가장 먼저 배운 것은 직렬화입니다. 사전은 멋지지만 복잡한 데이터를 포함하고 데이터에 액세스 할 때마다 캐스팅해야하며 오류 (특히 사용자 편집 등)가 포함되는 경향이 있습니다. 직렬화/직렬화는 'XmlSerializer'를 사용하면 매우 간단합니다. '설정'은 전혀 사용하지 않으시겠습니까? json이 설정을 저장하는 데 가장 적합한 형식 인 것으로 나타났습니다. – Sinatr

+2

관리자 권한 상승없이 한 사용자가 다른 사용자에게 영향을 미칠 수있는 바람직하지 않은 변경을 수행 할 수 있으므로 모든 사용자에게 적용되는 설정을 업데이트 할 수 없어야합니다.따라서 응용 프로그램 설정을 변경하는 것이 더 어렵다는 것을 완벽하게 이해할 수 있습니다. – Phil1970

답변

0

두 기술을 결합하면됩니다.

세션 시작시 구성 파일에서 구성된 설정을 읽고 쓰기 가능한 전역 정적 변수 (또는 지속성 형태)에 저장하십시오.

그런 다음 사용자가이 설정을 변경하기로 결정하면 설정 값을 변경하십시오.

public static Program { 

    public static string ConnectionString { get; set; } 

    void Main(string connectionString) { 
     ConnectionString = connectionString; 
    } 

} 

public class SomeOtherClass { 
    public void SomeOtherMethod() { 
     Program.ConnectionString = "new value"; 
    } 
} 

이것은 사용 방법에 대한 매우 간단한 예입니다. 문자열을 프로그램에 인수로 전달하는 대신 응용 프로그램 설정에서 기본값을 읽을 수도 있습니다. 또한 각 사용자마다 데이터베이스가 다를 수 있도록 사용자가 구성한 연결 문자열을 일종의 데이터베이스에 저장해야합니다.

+0

내 질문에 전혀 답하지 않는 것 같습니다. 이 접근법이 원래 게시물에 설명 된 "사용자 범위"와 다른 점을 확인하지 못했습니다. 또한 데이터베이스 연결 문자열을 데이터베이스에 저장하는 것이 타당하지 않을 수도 있습니다. (내 게시물의 유스 케이스를 참조하십시오.) – kmote

+0

그래서 응용 프로그램이 시작되면서 기본 설정을 변경할 수 있기를 원합니다. 물론 연결 고리에 대해서도 맞습니다. 따라서이 예제는 비뚤어졌습니다. 내가 시도한 요점은 스토리지에 대한 액세스가 설정에 의존하지 않는 한 사용자가 설정 한 설정을 저장할 때 모든 지속성 방법을 선택할 수 있다는 것입니다. – Glubus

+0

제가 말하고자하는 것은 런타임에 (즉, 응용 프로그램이 시작될 때) 디자인 타임에 기본 설정을 변경할 수 있기를 원합니다. – kmote

0

사례 연구에서 다음을 시도해 보았을 때 일반화 할 수 있습니까?

  1. 만큼 사용자가 기본 데이터베이스 이름을 변경할 수 있으므로이 키에 대한 사용자의 범위에 정의가 아닌 응용 프로그램 범위
  2. 을 내가 Windows 응용 프로그램을 가정 응용 프로그램을 설치하면,되어야로 첫 번째 실행, user.config 값이 데이터베이스 이름을 가지고 있는지 확인하십시오. 예이면 응용 프로그램로드, 그렇지 않으면 3 단계로 이동하십시오.
  3. 사용자에게 데이터베이스 이름이있는 화면이 기본값을 가지며 사용자 설정을 변경하고 여기에서 몇 가지 유효성 검사를 할 수 있는지 확인하십시오. 설정 페이지를 완료 한 후 user.config 파일에 저장하면 다음 실행시 응용 프로그램에서 필요한 설정을 찾을 수 있습니다 정상적으로 작동하려면
  4. 관리자 권한의 경우 런타임에 설정을 변경하는 단추를 표시 할 수 있습니다.

나는

희망이 뜻을 "여기서 등 데이터베이스 이름, 연결 문자열을, ... 이미지를 저장하기"와 같은 몇 가지 중요한 세부 사항을 정의하기 위해 사용자로부터 필요로하는 모든 응용 프로그램에이 기술을 사용 힌트 또는 무언가를 제공하십시오

+0

고마워요, 하디. 이것은 본질적으로 지금 사용하고있는 프로세스입니다 (2 단계에서 점검하지는 않았지만). 사용자가 프로그램을 실행하지 않고 기본값을 변경할 수있는 솔루션을 찾고 싶었습니다. – kmote