2010-06-22 30 views
12

Có ai biết cách tôi có thể đặt cài đặt cấp ứng dụng (hoặc người dùng) trong ứng dụng .Net có điều kiện trên chế độ phát triển ứng dụng hiện tại không? IE: Gỡ lỗi/Phát hànhCài đặt ứng dụng khác nhau tùy thuộc vào chế độ cấu hình

Để cụ thể hơn, tôi có tham chiếu url đến các dịch vụ web được lưu trữ trong cài đặt ứng dụng của tôi. Trong chế độ phát hành, tôi muốn các cài đặt đó trỏ đến http://myWebservice.MyURL.com trong chế độ gỡ lỗi Tôi rất thích các cài đặt đó là http://myDebuggableWebService.MyURL.com.

Bất kỳ ý tưởng nào?

+0

Cảm ơn bạn hhravn! –

Trả lời

5

Có, theo như tôi biết, không có cách nào được xây dựng để thực hiện việc này. Trong dự án của chúng tôi, chúng tôi duy trì 4 tệp cài đặt khác nhau và chuyển đổi giữa chúng bằng cách sao chép từng tệp vào tệp đang hoạt động trong bước dựng sẵn của bản dựng.

copy "$(ProjectDir)properties\settings.settings.$(ConfigurationName).xml" "$(ProjectDir)properties\settings.settings" 
copy "$(ProjectDir)properties\settings.designer.$(ConfigurationName).cs" "$(ProjectDir)properties\settings.Designer.cs" 

Điều này đã làm việc hoàn hảo cho chúng tôi trong một vài năm. Đơn giản chỉ cần thay đổi mục tiêu và toàn bộ tập tin cấu hình được chuyển là tốt.

Chỉnh sửa: Tệp được đặt tên, ví dụ: settings.settings.Debug.xml, settings.settings.Release.xm l vv ..

Scott Hanselman đã được mô tả một cách tiếp cận hơi 'thông minh', sự khác biệt duy nhất là chúng tôi không có kiểm tra để xem nếu các tập tin đã thay đổi: http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

4

Nếu bạn muốn giữ mọi thứ trong một tệp cấu hình, bạn có thể giới thiệu phần cấu hình tùy chỉnh cho app.settings của bạn để lưu trữ các thuộc tính cho chế độ gỡ rối và phát hành.

Bạn có thể lưu giữ đối tượng trong ứng dụng lưu trữ cài đặt cụ thể của chế độ nhà phát triển hoặc ghi đè ứng dụng hiện có dựa trên công tắc gỡ lỗi.

Đây là một ví dụ ngắn gọn giao diện điều khiển ứng dụng (DevModeDependencyTest):

App.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="DevModeSettings"> 
     <section name="debug" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" /> 
     <section name="release" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" /> 
    </sectionGroup> 
    </configSections> 
    <DevModeSettings> 
    <debug webServiceUrl="http://myDebuggableWebService.MyURL.com" /> 
    <release webServiceUrl="http://myWebservice.MyURL.com" /> 
    </DevModeSettings> 
    <appSettings> 
    <add key="webServiceUrl" value="http://myWebservice.MyURL.com" /> 
    </appSettings> 
</configuration> 

Đối tượng để lưu trữ cấu hình tùy chỉnh của bạn (DevModeSettings.cs):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace DevModeDependencyTest 
{ 
    public class DevModeSetting : ConfigurationSection 
    { 
     public override bool IsReadOnly() 
     { 
      return false; 
     } 

     [ConfigurationProperty("webServiceUrl", IsRequired = false)] 
     public string WebServiceUrl 
     { 
      get 
      { 
       return (string)this["webServiceUrl"]; 
      } 
      set 
      { 
       this["webServiceUrl"] = value; 
      } 
     } 
    } 
} 

Trình xử lý để truy cập cài đặt cấu hình tùy chỉnh của bạn (DevModeSettingsHandler.cs):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace DevModeDependencyTest 
{ 
    public class DevModeSettingsHandler 
    { 
     public static DevModeSetting GetDevModeSetting() 
     { 
      return GetDevModeSetting("debug"); 
     } 

     public static DevModeSetting GetDevModeSetting(string devMode) 
     { 
      string section = "DevModeSettings/" + devMode; 

      ConfigurationManager.RefreshSection(section); // This must be done to flush out previous overrides 
      DevModeSetting config = (DevModeSetting)ConfigurationManager.GetSection(section); 

      if (config != null) 
      { 
       // Perform validation etc... 
      } 
      else 
      { 
       throw new ConfigurationErrorsException("oops!"); 
      } 

      return config; 
     } 
    } 
} 

Và cuối cùng điểm mấu chốt của bạn để ứng dụng giao diện điều khiển (DevModeDependencyTest.cs):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace DevModeDependencyTest 
{ 
    class DevModeDependencyTest 
    { 
     static void Main(string[] args) 
     { 
      DevModeSetting devMode = new DevModeSetting(); 

      #if (DEBUG) 
       devMode = DevModeSettingsHandler.GetDevModeSetting("debug"); 
       ConfigurationManager.AppSettings["webServiceUrl"] = devMode.WebServiceUrl; 
      #endif 

      Console.WriteLine(ConfigurationManager.AppSettings["webServiceUrl"]); 
      Console.ReadLine(); 
     } 
    } 
} 
14

Tôi biết điều này đã được hỏi năm trước, nhưng chỉ trong trường hợp bất cứ ai đang tìm kiếm một giải pháp đơn giản và hiệu quả mà tôi sử dụng .

  1. Chuyển đến thuộc tính dự án, tab Cài đặt (bạn sẽ thấy URL dịch vụ web hoặc bất kỳ cài đặt nào khác đã được liệt kê tại đây).

  2. Nhấp vào nút "Xem mã" có sẵn trên trang Cài đặt.

  3. Nhập mã này vào hàm tạo.

    this.SettingsLoaded += Settings_SettingsLoaded; 
    
  4. Thêm chức năng sau đây dưới constructor:

    void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e) 
    { 
        #if(DEBUG) 
        this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION; 
        #else 
        this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION; 
        #endif 
    } 
    

Bây giờ bất cứ khi nào bạn chạy dự án của bạn, nó sẽ biên dịch chỉ dòng phù hợp với việc xây dựng cấu hình hiện tại.

3

SlowCheetah thêm các chức năng bạn yêu cầu không chỉ đối với App.config nhưng đối với bất kỳ tập tin XML trong dự án của bạn - http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

+1

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – Spontifixus

+0

Tôi nghĩ rằng đây có lẽ là câu trả lời hay nhất - có vẻ như cho phép chuyển đổi cấu hình cho mỗi lần xây dựng app.config (giống như xây dựng trong biến đổi web.config). –

12

Đây là hơi muộn để đảng, nhưng tôi stumbled khi một cách thoải mái thực hiện web.transform phương pháp tiếp cận cho các tệp app.config. (ví dụ: sử dụng không gian tên http://schemas.microsoft.com/XML-Document-Transform)

Tôi nghĩ rằng đó là "tốt" vì đây là một cách tiếp cận xml thuần túy và không yêu cầu phần mềm của bên thứ ba.

  • Tệp cha mẹ/mặc định App.config được tải xuống, theo các cấu hình xây dựng khác nhau của bạn.
  • Những hậu duệ này chỉ ghi đè những gì họ cần.

Theo tôi, điều này phức tạp hơn và mạnh mẽ hơn là phải duy trì số lượng tệp cấu hình được sao chép toàn bộ, chẳng hạn như trong các câu trả lời khác.

Một hương đã được đăng ở đây: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


Look, Mom - Không rõ ràng sau khi xây dựng các sự kiện trong IDE của tôi!

+0

Chúc mừng bạn đời làm việc hoàn hảo! – petric

0

Tôi đã có một vấn đề tương tự để giải quyết và kết thúc bằng cách sử dụng XDT (web.config) chuyển đổi động cơ, mà đã được đề xuất trong các câu trả lời từ ne1410s có thể được tìm thấy ở đây: https://stackoverflow.com/a/27546685/410906

Nhưng thay vì làm việc đó theo cách thủ công, tôi đã sử dụng plugin này: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

Plugin chỉ giúp thiết lập cấu hình, không cần thiết. các công cụ khác được yêu cầu.

Các vấn đề liên quan