2012-05-14 44 views
6

ví dụ:Có thể tự động thay đổi không gian tên thành ServiceContract trong thời gian chạy không?

[ServiceContract(Namespace = "@[email protected]/", 
     Name = "FedExContract")] 

tôi cần phải thay đổi giá trị của "@ services.url @" trong thời gian chạy.

+0

tại sao bạn cần ** thay đổi không gian tên trong khi chạy? –

+0

Điều này là để hỗ trợ một số quy trình hiện có. Khách hàng của tôi đang sử dụng Eclipse để xuất bản các dịch vụ cho IIS và họ thay thế các thẻ này trong thời gian xây dựng. Tôi đang lên kế hoạch chuyển tất cả các giá trị này sang cơ sở dữ liệu thay vì xây dựng quy trình. – WinFXGuy

+0

Tôi không thể tưởng tượng rằng điều này là có thể, tôi có nghĩa là pratically như thế nào nó sẽ làm việc? khi nào thì không gian tên sẽ thay đổi? Nó có kiểm tra mọi lúc dịch vụ được gọi không? Tôi chỉ có thể thấy một cái gì đó hoạt động khi dịch vụ được bắt đầu lại khi có thể bạn có thể đọc một cái gì đó từ một db, nhưng điều này vẫn không thay đổi khi thời gian chạy chỉ làm mới khi khởi động. Thủ tục hiện tại của bạn không thay đổi trong thời gian chạy, vì vậy tôi không chắc chắn tại sao đó lại là yêu cầu. –

Trả lời

0

Không thể nghĩ ra bất kỳ khác so với sử dụng biểu tượng Compilation có điều kiện, ví dụ:

#if Debug 
[ServiceContract(Namespace = "@[email protected]/", Name = "FedExContract")] 

#endif 

Namespaces có nghĩa là để được tĩnh như bạn có thể cần phải tạo proxy client của bạn nếu bạn thay đổi không gian tên của hợp đồng.

+0

Có thể đây là lựa chọn duy nhất còn lại. – WinFXGuy

0

Bạn có thể thay đổi nó trong thời gian chạy. Nhưng nó sẽ là rất nhiều công việc và nó sẽ phải xảy ra trước khi dịch vụ bắt đầu. Khi dịch vụ bắt đầu, bạn không thể sửa đổi thông tin hợp đồng.

Cá nhân tôi không thích dịch vụ bắt đầu phụ thuộc vào DB. Nếu một cái gì đó bị hỏng, dịch vụ sẽ không bao giờ xuất hiện và xử lý sự cố có thể là một quá trình phức tạp đối với CNTT. Nếu tôi đã đi các tuyến đường thời gian chạy, tôi sẽ lưu trữ các giá trị không gian tên trong tập tin cấu hình của tôi. Chỉ cần giữ nó đơn giản và vẫn cho phép mã thông báo triển khai thay thế giống như những gì bạn mô tả trong câu hỏi của mình.

Từ các nhận xét bạn đề cập đến quá trình tạo. Đây là cách chúng ta xử lý nó: Làm cho không gian tên là một chuỗi không đổi. Vì vậy, ví dụ:

[DataContract(Namespace=Constants.CURRENT_NAMESPACE] 
public class MyClass 
{ } 

Bây giờ trong một khai báo tập tin riêng biệt:

// in a separate file define: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Services"; 
}; 

Khi bạn muốn xây dựng cho một hoán đổi môi trường khác nhau ra hằng nộp đơn xin một định nghĩa mới:

//As a part of your build process switch the Constants file: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Eclipse/Services"; 
}; 

Dễ quản lý, bạn luôn biết không gian tên nào đang được sử dụng ... và dịch vụ luôn bắt đầu. Điều đó có hiệu quả không?

+0

Chúng tôi làm một cái gì đó tương tự. Có cách nào có thể được thực hiện từ MS Build thay vì sử dụng Eclipse/Ant? – WinFXGuy

+0

Tôi chắc chắn có, nhưng tôi không phải là người thích hợp để hỏi. Có thể là một câu hỏi thứ hai tốt để đăng. – ErnieL

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