Мне нравится создавать и размещать сервисы WCF.До сих пор я мог создавать сервисы, определяющие контракты для сервиса и данных (интерфейсы) и определяющие хосты и параметры конфигурации для их достижения (спецификации конечных точек).
Хорошо, рассмотрим этот фрагмент кода, определяющий сервис и использующий его.(нет упоминания о конечных точках, которые определены в app.config, здесь не показано):
[ServiceContract]
public interface IMyService {
[OperationContract]
string Operation1(int param1);
[OperationContract]
string Operation2(int param2);
}
public class MyService : IMyService {
public string Operation1(int param1) { ... }
public string Operation2(int param2) { ... }
}
public class Program {
public static void Main(stirng[] args) {
using (ServiceHost host = new ServiceHost(typeof(MyService))) {
host.Open();
...
host.Close();
}
}
}
Хорошо, эта структура хороша при создании чего-то, что можно было бы назвать автономной службой.Что делать, если мне нужен мой сервис, чтобы использовать объекты большего приложения.Например, мне нужен сервис, который делает что-то на основе определенной коллекции, определенной где-то в моей программе (которая является хостингом сервиса).Служба должна изучить эту коллекцию, выполнить поиск и вернуть определенный элемент.
Список, о котором я говорю, представляет собой список, управляемый программой и редактируемый и модифицируемый ею.
У меня естьследующие вопросы:
1) Как создать сервис, способный обработать этот список?Я знаю, что возможный вариант - использование перегруженного конструктора ServiceHost
, принимающего Object
вместо службы Type
.Так что я мог бы передать свой список там.Это хорошо?
[ServiceContract]
public interface IMyService {
[OperationContract]
string Operation1(int param1);
[OperationContract]
string Operation2(int param2);
}
public class MyService : IMyService {
private List<> myinternallist;
public MyService(List<> mylist) {
// Constructing the service passing the list
}
public string Operation1(int param1) { ... }
public string Operation2(int param2) { ... }
}
public class Program {
public static void Main(stirng[] args) {
List<> thelist;
...
MyService S = new MyService(thelist)
using (ServiceHost host = new ServiceHost(S)) {
host.Open();
...
host.Close();
// Here my application creates a functions and other that manages the queue. For this reason my application will edit the list (it can be a thread or callbacks from the user interface)
}
}
}
Этот пример должен проясниться.Это хороший способ сделать?Я правильно делаю?
2) Как обрабатывать конфликты на этом общем ресурсе между моей службой и моим приложением?Когда мое приложение запускается, размещая сервис, мое приложение может вставлять элементы в список и удалять их, то же самое можно сделать и с сервисом.Нужен ли мне мьютекс?как справиться с этим?Обратите внимание, что проблема параллелизма касается двух участников: основного приложения и службы.Это правда, что сервис одноразовый, но приложение действует в списке !!!Я предполагаю, что служба вызывается внешним объектом, когда это происходит, приложение все еще работает правильно?Есть ли параллелизм в этом случае ???
Спасибо