在生产和测试Web服务之间切换

时间:2018-08-14 09:19:01

标签: c# web-services

在生产和测试Web服务之间切换。

对于相同的WebService定义,我有2个版本。每个版本都有其自己的数据库url等。

MyLib.FooWebServicePROD.FooWebService _serviceProd;
MyLib.FooWebServiceTEST.FooWebService _serviceTest;

现在,我将一种形式与另一种形式进行对比,我在Visual Studio中使用了“重命名”选项。

我想将所有实例和定义包装在摘要中,这样就不会每次都对程序进行编辑。
因此,我制作了我的单例public sealed class FooBarWrap,但大量重复,例如:

public bool Close()
{
    if (_serviceProd != null)
    {
        _serviceProd.logout(guid);
        log4N.Info("Closing PROD");
    }
    if (_serviceTest != null)
    {
        _serviceTest.logout(guid);
        log4N.Info("Closing TEST");
    }
    return true;
}

public bool Login()
{
    try
    {
        log4N.Info("Connection to FooBar webservice...");
        if (isProd)
        {
            _serviceProd = new MyLib.FooWebServicePROD.FooWebService();
            _serviceProd.Timeout = System.Threading.Timeout.Infinite;
            _serviceProd.Logon(guid);
        }
        else {                    
            _serviceTest = new MyLib.FooWebServiceTEST.FooWebService();
            _serviceTest.Timeout = System.Threading.Timeout.Infinite;
            _serviceTest.Logon(guid);
        }
        log4N.Info("done");
        return true;
    }
    catch (Exception ex)
    {
        log4N.Info("failed !");
        log4N.Error("Echec connexion au webservice FooBar", ex);
        return false;
    }
}

是否有更简单的方法来实现这一目标?没有客户端引用一个或另一个Web服务,也没有繁重的代码重复?

if (FooBarWrap.Instance.Login()){
    //DoSomething   
    var ClientResult = FooBarWrap.Instance.SomeRequest()
}

1 个答案:

答案 0 :(得分:1)

  

有没有一种简单的方法可以做到这一点?没有客户端引用一个或另一个Web服务,也没有繁重的代码重复?

是的。

您可以简单地使用条件依赖注入,根据您所处的环境或主机名,端口号或url路径等任何其他条件,您将获得服务接口的不同实现。

一种简单的条件依赖注入,根据条件提供相同接口的一个或另一个实现。

kernel.Bind<ISomeService>().To<SomeService1>();

kernel.Bind<ISomeService>().To<SomeService2>().When(x => HttpContext.Current[host|port|url path] == "some value");

Ninject调用那种注入上下文绑定 https://github.com/ninject/ninject/wiki/Contextual-Binding