У меня есть некоторые сомнения по поводу хостинга услуг в WCF.
Я хочу разместить службу, используя подход с самостоятельным размещением.
ServiceHost
класс приходит на помощь.
Используя его, можно разместить службу, имеющую прямой доступ к Windows Hosting Framework.
Хорошо, рассмотрим следующие подходы:
0) ОБЩИЕ ПОЛОЖЕНИЯ: Во всех случаях предполагается, что файл конфигурации App.config
используется для установки ABC конечных точек. Так что в следующих кодах нет упоминания о конечной точке, просто не беспокойтесь об этом.
Мы также рассмотрим эти услуги:
[ServiceContract]
public interface IMyService {
[OperationContract]
string MyOp1(int myint);
[OperationContract]
string MyOp2(int myint);
}
public class MyService : IMyService {
// This service needs to be constructed providing at least a string or an integer, if an attempt to construct it wothout passing any of these is done, the service should raise an error.
MyService(string strparam) { ... }
MyService(int intparam) { ... }
MyService(string strparam, int intparam) { ... }
public string MyOp1(int myint) { ... }
public string MyOp2(int myint) { ... }
}
public class MyStandaloneService : IMyService {
// This service does not need to be constructed.
MyStandaloneService() { ... }
public string MyOp1(int myint) { ... }
public string MyOp2(int myint) { ... }
}
1) СЛУЧАЙ 1: Возможно разместить службу, используя эту перегрузку класса ServiceHost
:
public ServiceHost(
Type serviceType,
params Uri[] baseAddresses
)
Используя его, можно позволить инфраструктуре управлять созданием службы, потому что требуется просто тип службы. Конечно, строительство является основой для строительства. Конструктор без параметров будет вызван. Эта перегрузка хороша при обработке сервисов, которые не нуждаются в специальной конструкции ... какие-то автономные сервисы:
using (ServiceHost host = new ServiceHost(typeof(MyStandaloneService))) {
host.Open();
...
host.Close();
}
2) CASE 2: Возможно разместить службу, используя эту перегрузку класса ServiceHost
:
public ServiceHost(
Object singletonInstance,
params Uri[] baseAddresses
)
Используя его, можно создать экземпляр службы и затем разместить ее, не позволяя платформе справиться с этим ... этот подход хорош при работе со службами, которые нуждаются в особом обращении и не являются полностью автономными:
MyService MS = new MyService("the string");
using (ServiceHost host = new ServiceHost(MS)) {
host.Open();
...
host.Close();
}
Ну, я хотел бы понять следующее:
A) В CASE 1 можно автоматически разместить службу, указав тип. Если я попытаюсь создать другой сервис того же типа (MyStandaloneService
), это приведет к ошибке из-за попытки создать два одинаковых сервиса? Возможно, мне следует жестко закодировать, в данном случае, конфигурации конечных точек, потому что использование файла конфигурации приведет к тому, что две одинаковые службы будут размещены на одном и том же адресе.
B) В CASE 2 документация MSDN гласит, что это создает одноэлементный экземпляр службы. Поэтому, если я попытаюсь разместить другой сервис таким образом:
MyService MS = new MyService("the string");
MyService MS2 = new MyService(23);
ServiceHost host = new ServiceHost(MS));
ServiceHost host2 = new ServiceHost(MS2));
host.Open();
host2.Open();
...
host.Close();
host2.Close();
Получу ли я ошибку?
C) Если бы я хотел избежать единственного экземпляра, что мне делать?
Спасибо