Sử dụng ChannelFactory để tạo một thể hiện của nhà máy, sau đó lưu vào bộ nhớ cache ví dụ đó. Sau đó bạn có thể tạo các kênh communicatino khi cần/mong muốn từ istance được lưu trong bộ nhớ cache.
Bạn có cần thiết cho nhiều nhà máy kênh (tức là .., có nhiều dịch vụ) không? Theo kinh nghiệm của tôi, đó là nơi bạn sẽ thấy lợi ích lớn nhất về hiệu suất. Tạo một kênh là một nhiệm vụ khá rẻ tiền; nó thiết lập mọi thứ vào lúc bắt đầu cần có thời gian.
Tôi sẽ không lưu các kênh riêng lẻ - tôi sẽ tạo chúng, sử dụng chúng cho một hoạt động và sau đó đóng chúng lại. Nếu bạn cache chúng, chúng có thể hết thời gian và kênh sẽ bị lỗi, sau đó bạn sẽ phải hủy bỏ nó và tạo một cái mới.
Không chắc chắn lý do tại sao bạn muốn sử dụng singleton để triển khai ChannelFactory, đặc biệt nếu bạn định tạo và lưu trữ bộ nhớ cache và chỉ có một điểm cuối.
Tôi sẽ đăng một số mã mẫu sau này khi tôi có thêm một chút thời gian.
UPDATE: Mã Ví dụ
Dưới đây là một ví dụ về cách tôi thực hiện điều này cho một dự án tại nơi làm việc. Tôi đã sử dụng ChannelFactory<T>
vì ứng dụng tôi đang phát triển là một ứng dụng n-tier với một số dịch vụ và nhiều ứng dụng khác sẽ được thêm vào. Mục đích là để có một cách đơn giản để tạo ra một khách hàng một lần cho mỗi cuộc đời của ứng dụng, và sau đó tạo ra các kênh truyền thông khi cần thiết. Những điều cơ bản của ý tưởng không phải của tôi (tôi đã nhận nó từ một bài viết trên web), mặc dù tôi đã sửa đổi việc thực hiện cho các nhu cầu của tôi.
Tôi có một lớp trợ giúp tĩnh trong ứng dụng của mình, và trong lớp đó tôi có một từ điển và một phương pháp để tạo các kênh truyền thông từ nhà máy channelf.
Từ điển như sau (đối tượng là giá trị vì nó sẽ chứa các nhà máy kênh khác nhau, một cho mỗi dịch vụ). Tôi đặt "Cache" trong ví dụ dưới dạng một trình giữ chỗ - thay thế cú pháp bằng bất kỳ cơ chế bộ nhớ đệm nào bạn đang sử dụng.
public static Dictionary<string, object> OpenChannels
{
get
{
if (Cache["OpenChannels"] == null)
{
Cache["OpenChannels"] = new Dictionary<string, object>();
}
return (Dictionary<string, object>)Cache["OpenChannels"];
}
set
{
Cache["OpenChannels"] = value;
}
}
Tiếp theo là phương pháp tạo kênh liên lạc từ phiên bản gốc. Phương pháp này kiểm tra xem nhà máy có tồn tại trước không - nếu không, nó tạo ra nó, đặt nó vào từ điển và sau đó tạo ra kênh. Nếu không, nó chỉ đơn giản là tạo ra một kênh từ thể hiện được lưu trữ của nhà máy.
public static T GetFactoryChannel<T>(string address)
{
string key = typeof(T.Name);
if (!OpenChannels.ContainsKey(key))
{
ChannelFactory<T> factory = new ChannelFactory<T>();
factory.Endpoint.Address = new EndpointAddress(new System.Uri(address));
factory.Endpoint.Binding = new BasicHttpBinding();
OpenChannels.Add(key, factory);
}
T channel = ((ChannelFactory<T>)OpenChannels[key]).CreateChannel();
((IClientChannel)channel).Open();
return channel;
}
Tôi đã rút ví dụ này xuống một số từ những gì tôi sử dụng tại nơi làm việc. Có rất nhiều thứ bạn có thể làm trong phương pháp này - bạn có thể xử lý nhiều ràng buộc, gán thông tin xác thực để xác thực, v.v. của nó khá nhiều trung tâm mua sắm của bạn để tạo khách hàng.
Cuối cùng, khi tôi sử dụng nó trong ứng dụng, tôi thường tạo một kênh, thực hiện công việc kinh doanh của mình và đóng nó (hoặc hủy bỏ nó nếu cần). Ví dụ:
IMyServiceContract client;
try
{
client = Helper.GetFactoryChannel<IMyServiceContract>("http://myserviceaddress");
client.DoSomething();
// This is another helper method that will safely close the channel,
// handling any exceptions that may occurr trying to close.
// Shouldn't be any, but it doesn't hurt.
Helper.CloseChannel(client);
}
catch (Exception ex)
{
// Something went wrong; need to abort the channel
// I also do logging of some sort here
Helper.AbortChannel(client);
}
Hy vọng các ví dụ trên sẽ cho bạn điều gì đó để tiếp tục. Tôi đã sử dụng một cái gì đó tương tự như thế này trong khoảng một năm nay trong một môi trường sản xuất và nó đã làm việc rất tốt. 99% của bất kỳ vấn đề chúng tôi gặp phải thường có liên quan đến một cái gì đó bên ngoài ứng dụng (hoặc khách hàng bên ngoài hoặc nguồn dữ liệu không thuộc kiểm soát trực tiếp của chúng tôi).
Hãy cho tôi biết nếu mọi thứ không rõ ràng hoặc bạn có thêm câu hỏi.
Đối với # 3, vâng, chỉ nên tạo một nhà máy kênh. Về cơ bản, bạn sẽ có một nhà máy kênh cho từng dịch vụ mà bạn có. Trong trường hợp của tôi, chúng tôi có khoảng 6 cho đến nay, lây lan chủ yếu qua 2 tầng. Trong trường hợp của bạn, nếu bạn chỉ sẽ có một dịch vụ, sử dụng bởi một ứng dụng, bạn có thể chỉ cần làm những gì bạn đang làm ở trên. Bạn đang ở trên mã đang đi đúng hướng. Caching sẽ dựa trên nhu cầu của ứng dụng. – Tim
@Tim -thanks cho tất cả sự giúp đỡ của bạn. Tôi thực sự đánh giá cao nó! Tôi nghĩ trong trường hợp của tôi, sự thật là dịch vụ của tôi quá "đơn giản" đã khiến tôi bối rối nhìn qua những ví dụ khác nơi có nhiều điểm cuối. Tôi = ít bối rối hơn bây giờ = Tim đã làm một công việc tuyệt vời giải thích! Cảm ơn anh bạn! – Didaxis
Bạn đang khá hoan nghênh. Vui vì tôi có thể giúp - mã hóa vui vẻ! – Tim