私はIoCコンテナSimpleInjectorを使用しています。 シングルトンは目的ではないので再作成してはならないが、私の問題はWCFにあり、に入るときは何度か読んでも新しいインスタンスを作成する必要があることがわかった状態。SimpleInjector(Tridionを使用)でシングルトンインスタンスとしてWCFサービスを再作成する方法
2つの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サービスはFaulted状態になり続けます(シングルトンなので)。そのため、接続を再作成する方法が必要です。
私は、もちろん、それは私に同じインスタンスを与え、
coreServiceSession.EclServiceClient = (SessionAwareEclServiceClient)container.GetInstance(typeof(SessionAwareEclServiceClient));
ようなもので試してみました。しかし。
私も
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の代わりにこの使用しようとした:
coreServiceSession.EclServiceClient = new SessionAwareEclServiceClient(binding, eclServiceRemoteAddress);
同じことを。任意のアイデア/オプション?
この場合、強制的に新しいインスタンスを取得する必要がありますか?
UPDATE
これは、事前に
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();
}
}
おかげクラスCoreServiceSessionの一部です。 Guillermo
:
これはあなたの
CoreServiceSession
は、次のようになりますどのように?クライアントコードを共有できますか? –@StinkyTowelコードの一部を追加しました – polonskyg
** ISessionAwareCoreService sessionAwareEclServiceClient **の具象クライアントを作成するコードを追加できますか? –