Tôi cho rằng điều này là có thể, mặc dù tôi không chắc chắn bạn muốn điều này. Tôi sẽ đi theo cách tiếp cận sau đây (chưa được kiểm tra, không chắc chắn nếu nó hoạt động).Đầu tiên tạo nên cấu trúc dự án sau đây trong giải pháp của bạn:
ServiceInterfaces
ServiceImplementations
(tài liệu tham khảo ServiceInterfaces
và ModelClasses
)
ModelClasses
Host
(tài liệu tham khảo ServiceInterfaces
và ServiceImplementations
)
Client
(tài liệu tham khảo ServiceInterfaces
và ModelClasses
)
Trong ServiceInterfaces
bạn có một giao diện như thế này (tôi bỏ qua không gian tên, vv để làm ví dụ ngắn hơn):
[ServiceContract]
public interface IMyService<T>
{
T GetObject(int id);
}
Trong ServiceImplementations
bạn có một lớp mà thực hiện IMyService<T>
:
public class MyService<T> : IMyService<T>
{
T GetObject(int id)
{
// Create something of type T and return it. Rather difficult
// since you only know the type at runtime.
}
}
Trong Host
bạn có cấu hình chính xác cho dịch vụ của mình trong một tệp App.config
(hoặc Web.config
) và mã sau để lưu trữ dịch vụ của bạn (do đó là ứng dụng độc lập) :
ServiceHost host = new ServiceHost(typeof(MessageManager.MessageManagerService))
host.Open();
Và cuối cùng trong Client
bạn sử dụng một lớp ChannelFactory<TChannel>
để xác định một proxy:
Binding binding = new BasicHttpBinding(); // For the example, could be another binding.
EndpointAddress address = new EndpointAddress("http://localhost:8000/......");
IMyService<string> myService =
ChannelFactory<IMyService<string>>.CreateChannel(binding, address);
string myObject = myService.GetObject(42);
Một lần nữa, tôi không chắc chắn nếu làm việc này. Bí quyết là chia sẻ các giao diện dịch vụ của bạn (trong ServiceInterfaces
) và các đối tượng mô hình miền (trong ModelClasses
) giữa máy chủ và máy khách. Trong ví dụ của tôi, tôi sử dụng một chuỗi để trả về từ phương thức dịch vụ nhưng nó có thể là bất kỳ loại hợp đồng dữ liệu nào từ dự án ModelClasses
.
Nguồn
2009-08-31 20:18:26
Xem thêm http://stackoverflow.com/questions/6223886/generic-service-interface –