ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 在高并发WCF Web服务中使用实例和单例

2019-06-29 11:52:03  阅读:297  来源: 互联网

标签:c singleton wcf web-services net-4-5


我正在开发一个WCF Web服务,它根据字符串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);
}

StaticBroker

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
        }
    }
}

如您所见,我有一个Singleton of StaticBroker,它本身只存储每种类型DataManager的一个实例.最后,在DataManagers中,创建了实际工作类SomeVehicleFetcher的实际实例.

这是一种明智的做法吗?或者,当Web服务的并发使用率很高时,这些单身人士和共享实例是否会导致问题?我担心创建大量新实例可能会导致内存问题.如您所见,我并不真正了解应用程序的生命周期/内存周期在Web服务中的工作原理.

解决方法:

您正在尝试使用您不相信正确或需要的设计来解决假设性问题(“可能导致内存问题”).此外,ADO.NET还有大量优化处理数据库连接性能的优化.

这只是创造了更多的工作和更多的测试难题(你将如何隔离依赖于这个代理的代码?).

请参阅反模式:

过早优化,这里没有发明

编辑:

public interface IVehicleInfoRetriever {
    VehicleInfoResponse getVehicleInfo(string primaryCode);
}

public class DataManager<TVehicleInfoFetcher> 
    where TVehicleInfoFetcher : class, new(), IVehicleInfoRetriever 
{

    private string _providerCode;

    public DataManager() : this("UK") { }

    public DataManager(string providerCode) {
        _providerCode = providerCode;
    }

    public string getUpcomingVehicleInfoNow(string stopID)
    {
        VehicleInfoFetcher infoFetcher;
        if ( shouldCheckDB(stopID))
            VehicleInfoFetcher infoFetcher = new DatabaseVehicleInfoFetcher(_providerCode);
        else 
            fetcher = new TVehicleInfoFetcher();

            return fetcher.getVehicleInfo(primaryCode).Result;  // This is an async method, but we wait for the result
        }
    }

}

像这样的东西消除了对’经纪人’的需求.

此外,您称为“Broker”的类更多是工厂,工厂已经失宠,因为它们允许在杂草中而不是在顶部指定依赖注入,并且它们为单元测试进行环境配置复杂的事业.

当然,在DataManager的风格之间可能会有很多不同之处.如果是这种情况并且它们无法集中,那么我建议您调查可用的许多Inversion Of Control容器之一(AutoFac,Unity,Castle Windsor).这些容器将根据最顶层的提供者代码的运行时值保留DataManager要使用的风格的逻辑.

标签:c,singleton,wcf,web-services,net-4-5
来源: https://codeday.me/bug/20190629/1326068.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有