W naszym środowisku SharePoint/ASP.NET mamy szereg klas pobierania danych, które wszystkie pochodzą ze wspólnego interfejsu. Zostałem przydzielony do zadania stworzenia programu do pobierania danych, który mógłby zdalnie komunikować się z innymi farmami SharePoint za pomocą WCF. Sposób, w jaki mam to zaimplementowane w tej chwili, to singleton ChannelFactory<T>
jest tworzony w statycznym konstruktorze, a następnie ponownie wykorzystywany przez każdą instancję zdalnego pobierania danych w celu utworzenia indywidualnej instancji proxy. Pomyślałem, że to zadziała dobrze, ponieważ wtedy ChannelFactory
zostanie tylko raz utworzone w domenie aplikacji, a jego utworzenie to guaranteed to be thread-safe. Mój kod wygląda mniej więcej tak:Tworzenie singleton ChannelFactory <T> i ponowne używanie dla połączeń klienta
public class RemoteDataRetriever : IDataRetriever
{
protected static readonly ChannelFactory<IRemoteDataProvider>
RequestChannelFactory;
protected IRemoteDataProvider _channel;
static RemoteDataRetriever()
{
WSHttpBinding binding = new WSHttpBinding(
SecurityMode.TransportWithMessageCredential, true);
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.None;
binding.Security.Message.ClientCredentialType =
MessageCredentialType.Windows;
RequestChannelFactory =
new ChannelFactory<IRemoteDataProvider>(binding);
}
public RemoteDataRetriever(string endpointAddress)
{
_channel = RemoteDataRetriever.RequestChannelFactory.
CreateChannel(new EndpointAddress(endpointAddress));
}
}
Moje pytanie brzmi: czy to dobry projekt? Pomyślałem, że po utworzeniu ChannelFactory
nie muszę się martwić o bezpieczeństwo wątków, ponieważ używam go tylko do wywoływania CreateChannel()
, ale czy się mylę? Czy zmienia się stan, czy w inny sposób wykonuje coś za kulisami, które może powodować problemy z wątkami? Dodatkowo, czy muszę umieścić gdzieś kod (static finalizer?), Który ręcznie unieszkodliwia ChannelFactory
, czy mogę założyć, że ilekroć IIS zostanie ponownie uruchomiony, wykona dla mnie wszystkie prace porządkowe?
pokrewne: ChannelFactory Reuse Strategies
Znalazłem artykuł o das blonde, który wydaje się wskazywać to samo - http://www.dasblonde.net/PermaLink.aspx?guid=c7922cb4-26d4-408b-b029-cfadd75ff954. Jednak słowa "generowane dla ciebie" odstraszają mnie na całą ClientBase. Mimo wszystko, myślę, że jesteś na dobrej drodze. –
Podczas badania innego problemu z funkcją WCF odkryłem dobry powód, by faworyzować ChannelFactory nad ClientBase - http://stackoverflow.com/questions/2252747/what-is-system-servicemodel-diagnostics-callbackexception-and-why-cant -i-handle –
@Repo Man: Jeśli wolisz, ale ponowne pakowanie wyjątków nie jest najlepszą praktyką, chyba że masz ku temu dobry powód. W przypadku błędów tego typu w WCF, nie uważam, że kwalifikuje się do ponownego pakowania wyjątków. – casperOne