Я разрабатываю веб-службу WCF, которая возвращает информацию из одной из нескольких баз данных на основе string providerCode
.
На самом высоком уровне служба вызывает класс StaticBroker
, который проверяет providerCode
и возвращает соответствующий подкласс DataManager
, скажем, MyDataManager
. Затем служба вызывает MyDataManager.getVehicleFetcherForStop()
, который возвращает экземпляр класса VehicleInfoFetcher
, который используется для получения информации.
Я совершенно новичок во всем этом, и я думаю, что, возможно, неправильно спроектировал это. Вот код того, как я это делаю прямо сейчас (упрощенный):
Service.svc.cs
// Public-facing web service method
public string getRealtimeInfo(String stopID, string providerCode = "UK")
{
DataManager dm = StaticBroker.Instance.dataManager(stopID);
return dm.getUpcomingVehicleInfoNow(primaryCode);
}
Статикброкер
public sealed class StaticBroker
{
UKDataManager ukDataManager = null;
// Create one instance of each data manager when the Web Service is started,
// to save memory
private StaticBroker()
{
ukDataManager = new UKDataManager();
}
public DataManager dataManager(string providerCode)
{
if (providerCode.Equals(UKDataManager.DEFAULT_PROVIDER_CODE))
return ukDataManager;
// else if...
}
// Most singleton stuff snipped out
private static readonly StaticBroker instance = new StaticBroker();
}
UKDataManager
public class UKDataManager : DataManager
{
public const string DEFAULT_PROVIDER_CODE = "UK";
public string getUpcomingVehicleInfoNow(string stopID)
{
VehicleInfoFetcher infoFetcher;
if ( shouldCheckDB(stopID))
VehicleInfoFetcher infoFetcher = new DatabaseVehicleInfoFetcher("UK");
else
fetcher = new UKLiveVehicleInfoFetcher();
return fetcher.getVehicleInfo(primaryCode).Result; // This is an async method, but we wait for the result
}
}
}
Как видите, у меня есть синглтон StaticBroker
, который сам хранит только один экземпляр каждого типа DataManager
. Наконец, в диспетчерах данных создается фактический экземпляр класса, выполняющего настоящую работу, SomeVehicleFetcher
.
Это разумный способ сделать это? Или эти синглтоны и общие экземпляры приведут к проблемам при высоком параллельном использовании веб-службы? Я беспокоился, что создание множества новых экземпляров может привести к проблемам с памятью. Как видите, я не совсем понимаю, как работает цикл времени жизни/памяти приложения в веб-службе.