2010-02-11 8 views
11

.NET cho phép bạn sử dụng các tệp .settings để quản lý cài đặt ứng dụng. Tôi muốn để lưu trữ sản xuất, phát triển và thiết lập thử nghiệm riêng rẽ trong một cách mà tôi có thể làm một cái gì đó như thế này:Cách sử dụng các tệp .settings khác nhau cho các môi trường khác nhau trong .NET?

EnvironmentSettings environmentSettings; 

// get the current environment (Production, Development or Test) 
ApplicationEnvironment Environment = (ApplicationEnvironment) 
    Enum.Parse(typeof(ApplicationEnvironment), Settings.Default.ApplicationEnvironment); 

switch (Environment) 
{ 
    case ApplicationEnvironment.Production: 
     environmentSettings = Settings.Production; 
     break; 
    ... 
} 

string reportOutputLocation = environmentSettings.ReportOutputLocation; 

Về cơ bản, tôi muốn hai lớp Cài đặt riêng: lớp Cài đặt chung mà các cửa hàng môi trường được lựa chọn và không -Môi trường đặc tính cụ thể, và 3 trường hợp tĩnh của một lớp thứ hai được gọi là EnvironmentSettings. Ví dụ được sử dụng sẽ phụ thuộc vào môi trường được chỉ định trong lớp Cài đặt chung.

Có cách nào để thực hiện việc này một cách thủ công, đặt giá trị cho tất cả các cài đặt này trong một hàm tạo tĩnh hay không? Nếu tôi phải làm điều đó, tôi chỉ muốn có một lớp Cài đặt lớn với các thuộc tính như "DevOutputLocation", "LiveOutputLocation", v.v.

Tôi có thể có nhiều tệp .settings trong dự án của mình nhưng chỉ tạo các lớp riêng biệt không lấy được từ nhau. Vì vậy, tôi có thể tạo các tệp DevelopmentSettings.settings, ProductionSettings.settings và TestSettings.settings và cung cấp cho chúng cùng một thuộc tính, nhưng sau đó tôi sẽ cần một loạt các câu lệnh chuyển đổi ở mọi nơi để xác định lớp nào sẽ sử dụng vì chúng không xuất phát từ một lớp phổ biến .

+0

bạn có thể làm điều này bằng cách sử dụng một người dùng khác nhau cho mỗi môi trường, nhưng bằng cách nào đó tôi nghĩ rằng gây ra nhiều vấn đề hơn giải quyết. –

Trả lời

2

Tôi đang sử dụng phương pháp này cho tệp .config, tôi chắc chắn rằng nó cũng sẽ giúp bạn.Chỉ cần nhìn vào Scott Hanselman's blog postthis question. Tư tưởng đơn giản như địa ngục, nhưng hoạt động khá tốt. Tất cả bạn cần là:

  1. tạo nhiều file để cấu hình khác nhau
  2. tên chúng theo quy ước, ví dụ my.dev.settings, my.live.settings
  3. tạo bài sự kiện xây dựng (xem liên kết)
  4. thưởng thức =) mã

õ cho bạn lớp với các thiết lập sẽ luôn luôn nhìn vào các thiết lập mặc định (mà sẽ được thay thế sau mỗi lần xây dựng với một cái cần thiết), vì vậy phương pháp này đòi hỏi nỗ lực tối thiểu.

+0

Đây có phải là cách duy nhất không? Tôi cho rằng nếu nó được xác nhận bởi Scott H. Nó có vẻ giống như một hack thực sự lộn xộn. Bạn sẽ nghĩ bạn có thể chỉ định tệp .settings hoặc .config để sử dụng cho mỗi cấu hình xây dựng. – Carl

+0

Tôi vừa quay lại các câu hỏi trước đây của mình và nhận thấy tôi chưa bao giờ đánh dấu câu hỏi này là đã trả lời để bạn đi. Cảm ơn một lần nữa. – Carl

+0

Một khả năng khác là sử dụng công cụ chuyển đổi XML như [SlowCheetah] (https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5) –

0

Chỉ cần một ý tưởng nhưng nó có thể làm việc ...

  • Bạn sẽ cần N + 2 cài đặt tập tin (xây dựng N khác nhau; 2 thạc sĩ) với chứa các phím tương tự.

  • Xóa thuộc tính "Công cụ tùy chỉnh" cho tất cả chúng nhưng một trong các chủ nhân (do đó chỉ một chính tạo ra).

  • Sửa đổi tập lệnh dựng sẵn cho mỗi bản phát hành để sao chép nội dung tệp cài đặt thích hợp vào tệp xây dựng chính.

  • Sửa đổi tập lệnh sau khi xây dựng để sao chép nội dung tệp chính thứ hai trở lại vào tệp chính gốc.

Lưu ý: Nếu bạn có thể làm việc với nhà cung cấp kiểm soát nguồn trong tập lệnh trước và sau khi xây dựng, bạn không cần chủ phụ - bạn chỉ có thể xem trước khi tạo và hoàn tác kiểm tra sau khi xây dựng. Tuy nhiên, điều này có thể gây ra các sự cố trong môi trường tích hợp liên tục do tệp bị khóa sẽ yêu cầu bản dựng không thành công.

Tôi cũng chưa bao giờ làm điều này; mặc dù có những lúc tôi muốn có một cách làm mới hơn để làm điều gì đó như thế này trong VS.

2

Một ý nghĩ là việc chuyển đổi giữa một loạt các giá trị tĩnh có vẻ giống như một cách làm khá tốt. Tôi khuyên bạn nên tra cứu mẫu Singleton. Mẫu này cung cấp cho bạn một cá thể lớp đơn được chia sẻ giữa tất cả các tham chiếu đến lớp, nhưng khi nó được nạp lần đầu, bạn có thể thực hiện các bit khởi tạo bình thường để kiểm tra môi trường và thiết lập các giá trị tương ứng.

Tương tự, thay vì sử dụng nút chuyển để hoạt động trên các lớp khác nhau, bạn sẽ không xem xét thiết kế một Giao diện và mỗi lớp có triển khai giao diện đó không?

0

Chỉ cần một số thông tin thêm về NET môi trường dựa tập tin cấu hình mà không sử dụng thực hiện trên của bạn đặc biệt:

Các doanh nghiệp Thư viện có tính năng này từ V3.0: Summary

Visual Studio 2010 sẽ có tính năng này cũng thế. Gọi là Config Transformation

1

Có một chút phí tổn liên quan đến việc kiểm tra để xác định môi trường bạn đang chạy. Nếu bạn đang nói một môi trường web thì điều này có thể có nghĩa là một hiệu suất đáng kể. Tôi khuyên bạn nên tạo ba tệp cấu hình riêng biệt và thiết lập hệ thống tích hợp và triển khai liên tục xử lý việc đặt tên và cuộn ra khỏi tệp cài đặt thích hợp dựa trên môi trường. Trong trường hợp của bạn, bạn sẽ có ba tệp, Production.config, Development.config và Test.config. Sau đó, máy chủ tích hợp sẽ tạo một bản sao của tệp này cho web.config hoặc app.config dựa trên môi trường. Theo như bất kỳ bảo trì bổ sung nào liên quan đến việc duy trì ba tệp riêng biệt bất cứ khi nào thay đổi cấu hình, chúng tôi giữ các tệp được định dạng tự động và sử dụng một cái gì đó như WinMerge để dễ dàng thấy sự khác biệt và giữ chúng trong đồng bộ hóa thích hợp. Những loại tệp này thường không yêu cầu nhiều thay đổi và khi chúng thường là các bổ sung nhỏ.

1

Tôi hiện đang làm điều gì đó tương tự như giải pháp được đề cập bởi pdavis. Nhưng để đơn giản hóa nhiều tệp cấu hình, tôi sử dụng một mẫu T4 để tạo các tệp cấu hình cụ thể cho môi trường. Bằng cách đó, có một tệp web.tt xử lý việc tạo tệp web.config mặc định. Mỗi môi trường có tệp mẫu riêng của nó (qa.tt, production.tt, v.v.) kế thừa từ web.tt và chứa bất kỳ ghi đè cụ thể nào về môi trường. Bất kỳ thay đổi nào đối với cấu hình web - cài đặt ứng dụng mới, cài đặt cấu hình, v.v. được tự động truyền cho tất cả các tệp cấu hình cụ thể theo vùng bằng cách tạo lại các mẫu và bạn không phải lo lắng về việc giữ tệp đồng bộ bằng công cụ khác.