我正在开发一个 WCF 网络服务,根据
在最高层级上,服务调用
我对这些都很新,我认为我可能设计得有错。这是我现在的代码(简化版): Service.svc.cs
如您所见,我拥有一个
这样做是合理的吗?当Web服务高并发使用时,这些单例和共享实例是否会导致问题?我担心创建大量新实例可能会导致内存问题。正如您所见,我真的不太理解应用程序在Web服务中的生命周期/内存循环如何工作。
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
的一个实例。在DataManagers内部,最终创建了执行实际工作的类SomeVehicleFetcher
的实际实例。这样做是合理的吗?当Web服务高并发使用时,这些单例和共享实例是否会导致问题?我担心创建大量新实例可能会导致内存问题。正如您所见,我真的不太理解应用程序在Web服务中的生命周期/内存循环如何工作。