IoC 컨테이너 SimpleInjector를 사용하고 있습니다. 싱글 톤은 그 목적이 아니기 때문에 재 작성되어서는 안되지만 문제는 WCF에서 발생하고 에 입력하면 상태입니다. 몇 가지 읽기에 따라 복구 할 수없고 새 인스턴스를 만들어야합니다.SimpleInjector (Tridion 사용)로 Singleton 인스턴스로 WCF 서비스를 다시 만드는 방법
두 개의 WCF 서비스를 사용하는 CoreServiceService 클래스가 있습니다.
- CoreService
- ECLService
나는 이러한 서비스는 내가 CoreServiceSession에 전화를 많이 만들고 그 WCF 서비스가 너무 비싸고 시간이 많이 걸립니다 생성됩니다 싱글 이후가되고 싶어요, 창작 후 훨씬 더 빠릅니다.
나는이로 등록하고 있습니다 :
container.Register(() => new SessionAwareEclServiceClient(binding, eclServiceRemoteAddress), Lifestyle.Singleton);
container.Register(() => new SessionAwareCoreServiceClient(binding, coreServiceRemoteAddress), Lifestyle.Singleton);
container.Register(typeof(ICoreServiceSession), typeof(CoreServiceSession), Lifestyle.Scoped);
내 문제는 뭔가를 검색 할 수없는 경우 ECLService를 사용하는 동안 그 내가 .Abort을 (전화 케이스)과 가까이에서 오류가 발생한 연결로 진입이다 연결. 하지만 다음 번에 내 서비스를 호출 할 때 ECLService WCF 서비스는 오류 상태 (계속 싱글 톤이므로)로 유지되므로 연결을 다시 만들 수있는 방법이 필요합니다.
나는 물론, 그것은 나에게 같은 인스턴스를 제공
coreServiceSession.EclServiceClient = (SessionAwareEclServiceClient)container.GetInstance(typeof(SessionAwareEclServiceClient));
처럼 뭔가를 시도했지만.
coreServiceSession.EclServiceClient = new SessionAwareEclServiceClient(binding, eclServiceRemoteAddress);
같은 것들 :이
나는이 초기화를container.RegisterInitializer<ICoreServiceSession>(coreServiceSession =>
{
if (coreServiceSession.EclServiceClient.State == CommunicationState.Faulted)
{
coreServiceSession.EclServiceClient.Abort();
coreServiceSession.EclServiceClient = null;
coreServiceSession.EclServiceClient = (SessionAwareEclServiceClient)container.GetInstance(typeof(SessionAwareEclServiceClient));
}
}
같은 일을 사용하여 시도하고 내가 대신 container.GetInstance의 사용하려고했습니다. 어떤 아이디어/옵션?
어쨌든이 경우 새 인스턴스를 가져와야합니까?
UPDATE
이 클래스 CoreServiceSession 사전에
public class CoreServiceSession : ICoreServiceSession
{
public CoreServiceSession(ISessionAwareCoreService sessionAwareEclServiceClient, SessionAwareCoreServiceClient sessionAwareCoreServiceClient)
{
EclServiceClient = sessionAwareEclServiceClient;
CoreServiceClient = sessionAwareCoreServiceClient;
}
public ISessionAwareCoreService EclServiceClient { get; set; }
public SessionAwareCoreServiceClient CoreServiceClient { get; set; }
public string CreateOrGetStubUris(string eclItemUri)
{
var stubInfo = EclServiceClient.CreateOrGetStubUris(new List<string> { eclItemUri }).FirstOrDefault();
}
}
감사의 일부입니다. Guillermo
당신이 어떤 종류의 업데이 트/새로 고침을 강제로 인스턴스에 메서드를 추가 할 수 있습니다
이 당신의
CoreServiceSession
모습 수 어떻게? 고객의 코드를 공유 할 수 있습니까? –@StinkyTowel 코드의 일부를 추가했습니다. – polonskyg
** ISessionAwareCoreService sessionAwareEclServiceClient **의 구체적인 클라이언트를 생성하는 코드를 추가 할 수 있습니까? –