Я понимаю вашу путаницу между службой без сохранения состояния и узлом с сохранением состояния и как они могут взаимодействовать.
В этом примере кода я концептуально демонстрирую, как синглтон в памяти (механизм кэширования, который я далее называю CachingProvider
) может ссылаться на оба класса обслуживания (точнее, экземпляр службы в течение жизненного цикла запроса) и хост службы (в данном случае я выбрал Консольное приложение )
Я предполагаю, что здесь интерфейс службы и класс находятся в консольном проекте приложения, в котором размещается служба.
В этом простом примере мой примитивный класс CachingProvider
в основном действует как счетчик количества обращений к методу сервиса GetData, а хост сервиса будет опрашивать CachingProvider
каждые 5 секунд, чтобы получить счетчик сервиса. звонки сделаны до сих пор.
примечание: вы можете использовать утилиту WCFTestClient для быстрого тестирования.
Отказ от ответственности: Я ни в коем случае не предполагаю, что сложный механизм кэширования реализован так же просто, как в этом примере, этот код предназначен только для целей демосинтрации.
namespace ServiceHostConsole
{
[ServiceContract]
public interface ITestService
{
[OperationContract]
string GetData(int value);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class TestService : ITestService
{
public TestService()
{
CachingProvider.CallCount++;
}
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
//For demonstration purposes only
static class CachingProvider
{
static CachingProvider()
{
//private static constructor can initialize
//static cacheable resources
_callCounter = 0; //Trivial example of initialization
}
private static int _callCounter;
public static int CallCount
{
set { _callCounter = value; }
get { return _callCounter; }
}
}
class Program
{
static void Main()
{
using (var host = new ServiceHost(typeof(TestService), new Uri("http://localhost/TestService")))
{
host.Open();
//Example how the ServiceHost can report on a persistent in-memory object that is being
//updated each time the service is called.
new Timer(state => Console.WriteLine("# of service calls: {0}", CachingProvider.CallCount), null, 0, 5000);
Console.Read();
host.Close();
}
}
}
}