지미 맥 널티 (Gimmy McNulty)가 말한 것처럼 정적 멤버를 사용하는 옵션도 있습니다. 사용자 지정 IP 주소를 기반으로 네트워크 연결을 여는 WCF 서비스가 있습니다. 내 서비스는 PerCall 서비스 인스턴스 모드로 구성됩니다. 각 세션에서 정적 데이터 구조를 검사하여 지정된 IP 주소에 대해 네트워크 연결이 이미 열려 있는지 확인합니다. 여기에 예제가 있습니다.
[ServiceContract]
public interface IMyService
{
[OperationContract]
void Start(IPAddress address);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService : IMyService
{
private static readonly List<IPAddress> _addresses = new List<IPAddress>();
public void Start(IPAddress address)
{
lock(((ICollection)_addresses).SyncRoot)
{
if (!_addresses.Contains(address)
{
// Open the connection here and then store the address.
_addresses.Add(address);
}
}
}
}
구성한대로 Start() 호출은 자체 서비스 인스턴스 내에서 발생하며 각 인스턴스는 정적 컬렉션에 액세스 할 수 있습니다. 각 서비스 인스턴스는 별도의 스레드 내에서 작동하기 때문에 컬렉션에 대한 액세스가 동기화되어야합니다.
멀티 스레드 프로그래밍에서 수행 된 모든 동기화와 마찬가지로 잠금 시간을 최소화해야합니다. 표시된 예에서 첫 x 째 호출자가 잠금을 잡으면 다른 모든 호출자는 잠금이 해제 될 때까지 대기해야합니다. 이것은 내 상황에서 작동하지만, 당신의 상황에서는 작동하지 않을 수 있습니다.
다른 옵션은 PerCall 서비스 인스턴스 모드와 달리 단일 서비스 인스턴스 모드를 사용하는 것입니다.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class MyService : IMyService
{ ... }
내가 읽은 모든 것에서, PerCall은보다 유연 해 보입니다.
link의 차이점을 확인할 수 있습니다.
그리고 서비스를 구현하는 클래스가 바로 클래스라는 것을 잊지 마십시오. 모든 C# 클래스처럼 작동합니다. 정적 생성자, 속성, 이벤트 핸들러를 추가하고 추가 인터페이스를 구현할 수 있습니다.